Android中Fragment的嵌套问题
本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何解决Android中Fragment的嵌套问题。
我想知道这是否是Android API中的一个bug:
我进行了如下设置:
1代表一个在右侧负载2号fragment(一个搜索屏)的menu;
2代表一个包含3号fragment(一个result list)搜索屏;
3代表一个用于不同环境中的结果列表(result list),
在1,2和3号fragment作为ActivityFragment时,它们在手机上都可以正常运行。
但当我使用如下代码:
1
2
3
4
5
|
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment frag =
new
FragmentNumber2();
if
(toLoad !=
null
) frag.setArguments(toLoad);
transaction.replace(R.id.rightPane, frag);
transaction.commit();
|
其中R.id.leftPane和R.id.rightPane是linear layout在水平方向上的<fragment>。
我之前认为,上述代码是删除了原有的fragment,添加了一个新的fragment。很明显,我的理解不完全正确,因为当代码第二次执行命令的时候,你会看到:
1
|
07-27 15:22:55.940: ERROR/AndroidRuntime(8105): Caused by: java.lang.IllegalArgumentException: Binary XML file line
#57: Duplicate id 0x7f080024, tag null, or parent id 0x0 with another fragment for FragmentNumber3
|
造成这种结果主要是由于FragmentNumber3被复制,不再具备唯一的ID。而在此之前,1号fragment并未被破坏,请问这是Android中的bug吗?
(最佳答案)
这种异常是嵌套片段(nested fragment)与系统版本不相容导致的,而嵌套片段通常支持Android4.2。一个fragment的UI中嵌套另一个fragment,极有可能会造成程序运作异常。
注:嵌套片段只能在动态添加的操作中完成,也就是说,当layout中已经包含了一个<fragment>,就不能将再将这个layout嵌入到fragment中。
你可以用destroyview的方法清理parent fragment中的嵌套片段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Override
public void onDestroyView() {
try
{
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.remove(nestedFragment);
transaction.commit();
}
catch
(Exception e){
}
super
.onDestroyView();
}
|
你可以用ViewPager来添加进更多的fragment。目前, Android Support Library可以支持嵌套片段,所以你可以在Android 1.6及以上版本进行嵌套操作。只要调用Fragment中的getChildFragmentManager()命令,就可以完成添加操作。例如,下述代码就可以完成在现有的Fragment class中添加fragment的操作:
1
2
3
|
Fragment videoFragment =
new
VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
|
我在开发应用的过程中,也遇到过类似的问题,所以我用Linearlayout替换了xml文件中所有的fragment,然后在测试的环境下,用Fragment manager/ fragment transaction,对所有fragment逐一排查,最后程序可以正常运作。
原文链接:http://stackoverflow.com/questions/6847460/fragments-within-fragments
Android中error inflating class fragment
分类: Android实战2012-12-29 21:25 7563人阅读 评论(6) 收藏 举报
在Activity中静态使用fragment的时候,要注意两个地方。
Fragment引用的包是:
import android.support.v4.app.Fragment;
而不是:
import android.app.Fragment;
然后Activity必须是继承FragmentActivity
import android.support.v4.app.FragmentActivity;
不然就会出现这个错误。
调用fragment的生命周期函数的方式:
1.oncreate() 中 写纯数据
2.oncreteviews() 中加载控件
3.用inflater 定义整个fragment的view,然后用view获取其他控件,尽量不用getActivity(),使用时可加判断getActvity()为不为空
理解Fragment生命周期
分类: Android的深入2012-11-29 14:33 62852人阅读 评论(24) 收藏 举报
官网帮助文档链接:
http://developer.android.com/guide/components/fragments.html
主要看两张图,和跑代码
一,Fragment的生命周
二,与Activity生命周期的对比
场景演示 : 切换到该Fragment
11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume
屏幕灭掉:
11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop
屏幕解锁
11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume
切换到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView
切换回本身的Fragment:
11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume
回到桌面
11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop
回到应用
11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume
退出应用
11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach
比Activity多了一些生命周期,完整和Activity对接上,大家好好利用。