Android中Fragment的嵌套问题

Android中Fragment的嵌套问题

卢旭|2013-12-05 13:40|47754次浏览| 移动开发(232)SOF(124)Android(219) 0

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何解决Android中Fragment的嵌套问题。

问:Graeme

我想知道这是否是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.leftPaneR.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吗?

答:hackbod

(最佳答案)

这种异常是嵌套片段(nested fragment)与系统版本不相容导致的,而嵌套片段通常支持Android4.2。一个fragment的UI中嵌套另一个fragment,极有可能会造成程序运作异常。

注:嵌套片段只能在动态添加的操作中完成,也就是说,当layout中已经包含了一个<fragment>,就不能将再将这个layout嵌入到fragment中。

答:furykid

你可以用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();
     }

答:Reneez

你可以用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();

答:draksia

我在开发应用的过程中,也遇到过类似的问题,所以我用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对接上,大家好好利用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值