完美解决 两层Fragment,内层空白
来源:互联网 发布:网络系统管理 编辑:程序博客网 时间:2024/05/03 03:23
前言
两层Fragment在某些情况下,内层Fragment会显示空白,这是一个比较常见的问题,以前我也有一些解法,这次又遇到了这个问题,索性看了一下Fragment相关的源码,找到了问题的根源。
如果你想看一下什么样的代码会出现Fragment出现空白,这个demo会告诉你。
之前写过一篇文章两层Fragment嵌套,外层Fragment切换时内层Fragment不显示内容,是两层Fragment,外层使用replace切换,内层是ViewPager切换,内层的Fragment在某些情况下会不显示。现在来看这和两层ViewPager是一个原因的。
解法
解法有很多,这里先写两种可行的解法,下面章节会解释产生空白Fragment的根本原因,当你知其所以然的时候,就可以有n种解法了。
- 通过ViewPager.setOffscreenPageLimit(3);设置ViewPager离屏的Page很大。
- 修改包含内层Fragment的外层Fragment的onCreateView方法成下面这个样子
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(rootView == null){ rootView = inflater.inflate(R.layout.fragment3, null); // 初始化View,添加Fragment // ... } return rootView; }
原因剖析
产生空白的根本原因是往ViewGroup里添加子View失败。
概念
要解释明白这个过程首先需要明确几个概念,不知道各位看官是否明确,我先在这里列出来:
- Fragment有一个叫mView的属性,就是这个Fragment对应的View,归根结底来说,Fragment就是代表一个View,FragmentManager操作Fragment就是操作Fragment所包含的View的添加、删除等,只是在他上面加了一些类似生命周期的控制。
- FragmentManager这个类是管理Fragment的类,比如添加Fragment就是这个类来实现的,它添加一个Fragment的时候回让一个字符串与一个Fragment,如果这个字符串存在,就不会再添加这个Fragment。
- FragmentManager这个类是与Actiity相关的,就是 * 一个FragmentAativity *,这一点很重要。
- 如果Fragment结合ViewPager使用,那么Fragment是被Adapter调用FragmentManager添加的,与Fragment对应的字符串是在Adapter里决定的,有Fragment类名相关的一个字符串。
约定
下面我们做如下约定:一个Activity通过一个ViewPager包含4个Fragment,分别命名为mFragment1,mFragment2,mFragment3,mFragment4,其中mFragment3通过ViewPager包含3个Fragment,分别命名为mFragment31,mFragment32,mFragment33。
操作:
- 1、显示mFragment1
- 2、显示mFragment3
- 3、显示mFragment1
- 4、显示mFragment3
在第4步的时候,内层的Fragment就会不显示。
解释
- 执行完第2步:mFragment3的onCreateView返回的View显示在屏幕上,里面添加了几个子View,子View就是Fragment对应的View,而且这几个子View是通过FragmentManager添加的,有String与之对应。
- 执行完第3步:mFragment3的onDestroyView方法会执行,代表着mView将被废弃,下次会通过onCreateView创建一个新的mView。在FragmentManager里mFragment32对应的字符串还存在,因为我们都知道FragmentPagerAdapter里的destroyItem没有被执行,至于destroyItem方法什么时候被执行你应该懂的。
- 执行完第4步:mFragment3的onCreateView方法被执行,返回的rootView显示在界面上,然后我们的代码里会通过FragmentPagerAdapter给这个rootView添加Fragment,也就是给这个rootView添加子View。在我们添加Fragment的过程中,因为在前面的过程中mFragment32对应的字符串已经存在了,所以添加mFragment32是失败的,即给rootView添加子View失败,所以界面里显示的就是空白。
总结
归根结底看是由于一些Fragment相关的原因导致往ViewGroup里添加子View失败。至于解法就可以有很多了,比较而言,我觉得前文提到的两种解法是比较好的,如果内存不紧张的情况下推荐用解法1;内存比较紧张的情况下,建议采用解法2
- 完美解决 两层Fragment,内层空白
- 两层fragment内层切换不显示的问题
- 两层Fragment嵌套,外层Fragment切换时内层Fragment不显示内容
- 两层Fragment嵌套,外层Fragment切换时内层Fragment不显示内容
- 完美解决ViewPager+Fragment二次加载空白问题
- viewpager两层嵌套+内层循环滑动
- Fragment嵌套内层不显示
- Fragment 重叠 遮盖问题 完美解决
- 完美解决Fragment重叠的问题
- 完美解决点击空白处,隐藏软键盘
- 完美解决 WIN7 打开或关闭Windows功能 空白
- 完美解决点击空白处,隐藏软键盘
- 使用getChildFragmentManager解决Fragment嵌套ViewPager出现空白
- 解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题
- 解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题。
- 解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题。
- 完美解决Viewpager+Fragment 重复创建的问题
- 使用观察者模式完美解决activity与fragment通信问题
- How to Learn R
- C# Winform窗口之间传值的多种方法浅析
- js如何获取当前月的天数
- Ubuntu下redis开放端口
- hdu2460 poj3694 求桥 + 求lca
- 完美解决 两层Fragment,内层空白
- Android——安卓中涉及的设计模式
- java, c#类执行顺序
- 应用启动
- YY3-带人的技术(第二章)笔记-__XwD__-V2
- ViewPager中嵌套HorizontalScrollView导致无法滑动换页冲突解决
- #ifdef和#endif用法
- 两种解决头文件被重复包含方法的联系与区别
- php生成文字水印时中文乱码的问题