Android开发学习日记

Binary XML file line #8: Must specify unique android:id, android:tag, or have a parent with an id for ...   在创建fragment后执行程序时产生的错误,翻译了一下,原来是fragment必须要起一个id,如果匿名则会产生错误。


可以通过fragment和radiogroup的组合使用来替代tabhost,

<RadioButton
    style="@style/weibo_tab"
    android:text="歌曲列表" />
radiobutton可以通过style来统一设置样式

radiobutton的按键响应效果也可以用selector来实现


service使用前要注册,service使用前要注册,service使用前要注册

读取SD卡目录前要在manifest.xml里申请权限,读取SD卡目录前要在manifest.xml里申请权限,读取SD卡目录前要在manifest.xml里申请权限

重要的事要说三遍



2015-10-20 00:01:37

项目中使用了fragment,想要在activity中获得fragment里的组件,由于fragment是动态添加的,根据activity和fragment的生命周期来看,执行的顺序是

activity.onCreate() ==> fragment.onAttach() ==> fragment.onCreate() ==> fragment.onCreateView() ==> fragment.onActivityCreated() ==>Activity.onStart() ==>fragment.onStart()  ...,所以如果在activity的onCreate中动态添加的fragment,没有执行fragment的onCreateView()中的inflate函数,findViewById是无法找到组件的。

所以要在activity的onStart函数中执行

ListView lv_music = (ListView) musicListFragment.getView().findViewById(R.id.lv_music);
        



2015-10-20 20:55:09

新建一个listview或gridview,除非在view上有子view要设置点击响应事件才重新自定义adapter,
一般情况下都可以直接使用SimpleAdpter搞定

对于 LinearLayout

当 android:orientation="vertical"  时, 只有水平方向的设置才起作用,垂直方向的设置不起作用。

当 android:orientation="horizontal" 时, 只有垂直方向的设置才起作用,水平方向的设置不起作用。 使用fragment的replace函数后,新的fragment会覆盖到旧的fragment上,此时如果新的fragment没有背景色,那么旧的fragment依然会显示在屏幕上,在stackoverflow上查了下,解决办法有两个 1.给新的fragment添加背景色,默认不添加背景色时,fragment是透明的
 
2.删除掉旧的fragment

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.imageButtonSettingsManageBooks:

        if (mPurchaseHistory == true) {
            ft.remove(phFragment);

            Log.d(TAG, "REMOVING PURCHASE HISTORY FRAG");

        } else if (mAudio == true) {
            ft.remove(aFragment);

            Log.d(TAG, "REMOVING AUDIO FRAG");
        } else if (mRestore == true) {
            ft.remove(rFragment);

            Log.d(TAG, "REMOVING RESTORE FRAG");
        } else if (mCopyright == true) {
            ft.remove(cFragment);

            Log.d(TAG, "REMOVING COPYRIGHT FRAG");
        } else if (mAbout == true) {
            ft.remove(abFragment);

            Log.d(TAG, "REMOVING ABOUT FRAG");
        }
        ft = fragmentManager.beginTransaction();


2015-10-21 19:06:58

我们在解决了上个问题之后会发现,虽然新的fragment可以覆盖到旧的fragment上面了,但是点击旧fragment有按键的位置后,还是会有按键音提示,并且事实上旧fragment还是会响应按键的监听事件,这是为什么呢?

这是因为新产生的fragment覆盖到了旧fragment之上,当点击屏幕后,根据Android的事件分发机制
Android开发学习日记_第1张图片

Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()



所以只要让新fragment将点击的消息消费掉,就不会再传递给下面的旧fragment了,而要消费掉消息,就需要dispatchTouchEvent()返回true,就需要onTouchEvent()返回true,
而onTouchEvent()的函数内容
public boolean onTouchEvent(MotionEvent event) {
        //...

        if (((viewFlags & CLICKABLE) == CLICKABLE ||
                (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                   //...
            }

            return true;
        }

        return false;
    }

想要返回true,就需要将CLICKABLE设置为true,所以,只需要在xml布局文件里将该fragment设置clickable属性为true即可。

2015-11-13 20:31:24
打算在两个activity之间传递service对象,于是把service对象设置了serialize接口,结果发生如下错误:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.selfstudy.dc.dcmusicplayer.service.MusicService)
原来不仅service对象要实现serialize接口,service内部的成员也都要实现serialize接口才可以。




FragmentTransaction的addToBackStack()函数失效,原因一般是没有和Activity使用同一的包,使用
import android.app.Activity;
import android.app.FragmentTransaction;

你可能感兴趣的:(Android开发学习日记)