问题1、fragment嵌套fragment不显示问题

通常时候,我们制作底部Tab切换,会用到fragment。即一个Activity下,使用4种fragment。这次遇到的问题是关于fragment再次嵌套fragmen的问题,功能需要在其中一个fragment中再次嵌套frament,使用viewPager嵌套,此时需要注意一点,使用viewpager包裹住子fragment,我们都知道viewpager需要传入一个adapter,而此adaper需要一个fragmentManager,注意了!!!!!!这个fragmentManager必须是getChildFragmentManager。不能使用mActivity.getSupportFragmentManager()。造成的后果就是不显示问题了,关键是没有任何报错信息,一开始着实困扰了我好一阵子。

关于getChildFragmentManager和getSupportFragmentManager的区别:

首先需要知道一点:getSupportFragmentManager是在v4包下的,如果不是v4包下的,则称getFragmentManager。

我们先看getChildFragment的源码是怎么解释他的:

返回一个私有的管理器manager,该manager用于放置和管理子fragment。即getSupportFragmentManager获取到的是当前fragment的下一级的fragments的管理器。

getSupportFragmentManager的源码解释:

getFragmentManager也是一样的。 返回与此activity相关联交互的manager。即返回的是activity下的管理器,用于管理activity下与之相关联的fragent。

如果我们在父fragmen中调用getFragmentManager或者getSupportFragmentManager,返回的是activity下的manager,即把自己添加进来的manager。这就是上文提到的frag不显示的问题所在。

额外小栗子:加入FragmentA下有一个子FragmentB,(A包含B)。fragmentB调用getFragmentManager,得到的是fragmentA下的manager,即得到的是A调用的getChildFragmentManager。

结论:getFragmentManager()是本级别管理者, getChildFragmentManager()是下一级别管理者.

问题2、子fragment嵌套在xml文件中

官网中有这么一句话;

Note: You cannot inflate a layout into a fragment when that layout includes a <fragment>.
Nested fragments are only supported when added to a fragment dynamically.

简单来说,fragment不能写死在某个Fragment的xml文件中,fragment只能支持动态的添加进另一个fragment中。

如果Fragment被嵌套写在了布局里, inflate到这个标签的时候就相当于将它加进了FragmentManager里.
如果嵌套的parent fragment因为需要重建View而重新走了onCreateView()方法, 再次inflate, 此时就会抛出异常: InflateException in Binary XML

之前为什么可以呢? 非嵌套的情况, fragment直接加在activity里, 如果需要重新inflate, 必定是在onCreate()里, activity是重新建的, 所以没有问题, 因为不存在fragmentManager中已经持有同一个fragment的问题.

举一个例子:
在嵌套的情况下, 如果FragmentE布局里有FragmentA, 这时候我们需要叠加一个FragmentD.
用了replace(), 并且addToBackStack().
当D显示的时候, E实际上View是被销毁的, 然后back回来, 重建View, 即FragementE需要重新从onCreateView
()开始走生命周期, 走到inflate的时候又看到了fragmentA的标签.
但是这时候A实际上还在FragmentManager里面, 所以就会抛出如下的异常:
android.view.InflateException: Binary XML file line # XX: Binary XML file line #XX: Error inflating class fragment
崩溃的位置就在parent fragment(FragmentE) inflate的时候.

问题3、把fragment放在一个动态布局里

把fragment放在一个动态布局里 -> java.lang.IllegalArgumentException: No view found for id

发现这个错误是因为项目中的一个子Fragment是添加在RecyclerView里面的一块的.
RecyclerView要等到Loader的数据取到了之后再populate每一块的布局.
还是上面的流程, 启动父fragment, load数据, 添加子fragment, 这都没有问题.
但是一旦如果是上面的replace()addToBackStack() , 并且再次返回, 就会出现异常.

因为当重建View的时候, fragmentManager其中是持有child fragment的, 但是找不到它的container, 于是就会抛出异常.
栗子:
在Fragment F中, 先添加一个FrameLayout, 再把child fragment A加进去.
然后在Activity中, 用D replace F, 按back键返回, 就会有crash:

     java.lang.IllegalArgumentException: No view found for id 0x7f0c0062 (com.example.ddmeng.helloactivityandfragment:id/frame_container) for fragment FragmentA{b37763 #0 id=0x7f0c0062 FragmentA}at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:965)at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1130)at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1953)at android.app.Fragment.performActivityCreated(Fragment.java:2234)at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:992)at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)at android.app.BackStackRecord.popFromBackStack(BackStackRecord.java:1670)at android.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1587)at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:578)at android.app.Activity.onBackPressed(Activity.java:2503)

这是因为返回的时候FragmentManager找不到对应的container了.
所以应该避免这种做法, 尽量把fragment加进parent的根布局里, 而不是某个动态添加的布局.

补充

1.推荐使用v4包下的fragment,兼容性更强

2.除了上面提到的viewpager中添加fragment,还可以动态的添加fragment。此时需要用到的也是getChildFragmentManager

        Fragment fragment = new CharFrag();FragmentTransaction transaction = getChildFragmentManager().beginTransaction();transaction.add(R.id.charXXXX_fragment, fragment).commit();

对于其内部的子fragment,比如这里的CharFrag,可以使用getParentFragment()方法获取到宿主fragment。

参考:https://www.cnblogs.com/mengdd/p/5552721.html

Fragment嵌套Fragment相关推荐

  1. Android开发-Fragment嵌套Fragment

    Android开发-Fragment嵌套Fragment 前言 使用依赖 远程仓库地址 布局实现 使用控件 xml代码 Java实现 效果图 项目地址 前言 在大多数公司中,他们会尽量少写Activi ...

  2. android fragment 嵌套,Fragment嵌套Fragment时遇到的那些坑

    由于项目要改成MVP模式,自然会用到了Fragment,有时候可能会需要一个Fragment里面嵌套多个Fragment,并且add完成后需要立即刷新子Fragment的View,那么这个时候就会抛出 ...

  3. fragment嵌套fragment类,然后调用其中方法,处理请求。

    跳转fragment时使用: getActivity().getSupportFragmentManager().beginTransaction().add(R.id.right_voucher_f ...

  4. 浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

    自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确实是Fragment带来的一些优点,比如说:Fragment可以使你能够将a ...

  5. 【Android Fragment】Fragment基础

    fragment "分段"."碎片"的意思,一般与Activity一起使用,嵌套在activity中表示为Activity界面的一部分. 它具有自己的生命周期, ...

  6. Android Fragment 嵌套使用报错

    在新的SDK每次创建activity时,会自己主动生成 <pre name="code" class="java">public static cl ...

  7. Android Fragment中嵌套Fragment,不显示view

    原文链接:http://www.jianshu.com/p/e146698482f5 先看一段错误代码,这段代码写在一个 Fragment 中: private void initView(){mVi ...

  8. Android Fragment嵌套导致的bug

    原文链接 Android 多个Fragment嵌套导致的三大BUG Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误 http ...

  9. 安卓开发fragment报错_android开发 Fragment嵌套调用常见错误

    在activity中有时需要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题.在使用时要注意几点: 1.fragment中嵌套fragment,子f ...

最新文章

  1. 如何判断一个数是否在40亿个整数中?
  2. python使用什么来表示不同级别的语句块-Python
  3. mysql数据库导入外部数据乱码么_解决MySQL数据库导入导出数据乱码的问题
  4. vmware virtualization software
  5. 调用存储过程,名称,参数,类型都正确,但没有结果集的解决方法
  6. php redis mset,MSET命令_视频讲解_用法示例-redis编程词典-php中文网
  7. mediawiki禁止注册
  8. 信息学奥赛一本通C++语言——1006:A+B问题
  9. 为什么我不推荐Python初学者直接看项目源码?工作五年的程序员给的忠告
  10. centos6.8 安装php7
  11. 文本聚类分析算法_常用的聚类分析算法综述
  12. ERP源码 跨境电商ERP源码 Java电商ERP源码
  13. Python 矩形积分法计算f_x=x函数的值(完美实现)
  14. 计算机无法获取正常的ip地址,无法获取ip地址,教您电脑无法获取ip地址的解决方法...
  15. Linux设备模型(1)_基本概念
  16. JPEG系列一 JPEG图片的文件格式
  17. 将页面全部颜色变成灰色
  18. Kettle 记录集连接实战
  19. 华为交换机:三层交换机实现vlan间通信
  20. Linux onvif协议实现二(C语言客户端)

热门文章

  1. 服务器为什么找不到抢先服,王者荣耀:抢先服新版本上线,新增多种内容,唯独没有李信消息!...
  2. 人工智能数据标注平台推荐
  3. 球形FP-MAP的接收端迭代检测模型
  4. Google Pay支付遇到的问题
  5. 好好学习,天天向上——“C”
  6. 钕铁硼NdFeB材料各类牌号磁特性大全
  7. kali linux网络扫描~网络扫描
  8. 装饰模式实例与解析 实例一:变形金刚
  9. python的mapl画图y轴排_python中用Matplotlib做多个纵轴 (多y轴)
  10. 蓝桥杯 第十七天 动态规划(3)