您的位置:首页 > 移动开发 > Android开发

Android开发学习日记

2015-10-18 16:33 441 查看
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是透明的
[code]
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中的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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: