完美解决 两层Fragment,内层空白

转载:http://blog.csdn.net/bingospunky/article/details/51352400

目录(?)[+]

前言

两层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嵌套时出现空白,(收藏别人的)的更多相关文章

  1. 两层Fragment嵌套,外层Fragment切换时内层Fragment不显示内容

    尊重他人劳动成果,转载请说明出处:http://blog.csdn.net/bingospunky/article/details/46847269 需求 在搭界面有这么样一个需求:须要两层的Frag ...

  2. anglar JS使用两层ng-repeat嵌套使用,分辨$index

    使用ng-init给首层的每个元素赋值一个独立的值. ng-init="outerIndex = $index;" HTML: <div class="catego ...

  3. activity 嵌套一级fragment,一级fragment嵌套二级fragment,在一级fragment中刷新二级fragment中的UI

    今天遇到挺纠结的问题,由于产品设计的问题,技术上涉及到activity 嵌套一级fragment,一级fragment嵌套二级fragment,在一级fragment中刷新二级fragment中的UI ...

  4. 两层嵌套的JSON包的解法

    由于后台的变态,有时候会出现两层甚至多层嵌套的JSON包. 一层的很好解,而且我看过一些比较大的网站新闻接口返回的JSON包也仅仅是一层的. 比如下图所示一层的包 代码也很简单直观 dict = [d ...

  5. Android解决Fragment多层嵌套时onActivityResult无法正确回调的问题

    前言: Fragment也可以使用startActivityForResult方法去打开一个Activity,然后在其onActivityResult方法中处理结果,可是当Fragment嵌套的时候, ...

  6. [转]oracle分页用两层循环还是三层循环?

    select t2.* from --两层嵌套 (select t.* , rownum as row_numfrom t where rownum <=20) t2 where t2.row_ ...

  7. Android 多个Fragment嵌套导致的三大BUG

    Android有碎片化的问题,当然本文说的碎片化不是指的系统版本碎片化的问题,而是Fragment组件碎片化的问题. 很久之前,在Android 3.1系统发布的时候,Google推出了使用Fragm ...

  8. Deep Learning入门视频(上)_一层/两层神经网络code

    关于在51CTO上的深度学习入门课程视频(9)中的code进行解释与总结: (1)单层神经网络: #coding:cp936 #建立单层神经网络,训练四个样本, import numpy as np ...

  9. Linux网络栈下两层实现

    http://www.cnblogs.com/zmkeil/archive/2013/04/18/3029339.html 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linu ...

随机推荐

  1. Elasticsearch一些使用笔记(持续更新)

    这篇博客记录这一些运维ES的一些经验. 1.节点磁盘使用率过高,导致ES集群shard无法分配,丢失数据? 有两个配置,分配副本的时候 参数名称 默认值 含义 cluster.routing.allo ...

  2. A - Alice's Print Service ZOJ - 3726 (二分)

    Alice is providing print service, while the pricing doesn't seem to be reasonable, so people using h ...

  3. eclipse下properties文件中文乱码的解决方案

    今天在工程下编辑.properties文件时输入了中文然后就保存出错,弄了好久才搞定!大家瞄瞄 在中文操作系统下,Eclipse中的Java类型文件的编码的默认设置是GBK,但是对Properties ...

  4. Bootstrap-datepicker3官方文档中文翻译---Options/选项(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)

    Options/选项 带“Date”的所有选项都可以处理 Date 对象; 字符串格式化根据 给定的 format 而定; 相对于今天的时间变量, 如 “-1d”, “+6m +1y”等等, 其中有效 ...

  5. celery 定时任务时间篇

    1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: 1 #coding:utf-8 2 from celery.task.sche ...

  6. Zabbix (三)

    一.zabbix支持的主要监控方式: zabbix主要Agent,Trapper,SNMP,JMX,IPMI这几种监控方式,本文章主要通过监控理论和实际操作测试等方式来简单介绍这几种方式的监控原理和优 ...

  7. SpringBoot动态配置加载

    1.SpringBoot对配置文件集中化进行管理,方便进行管理,也可以使用HttpClient进行对远程的配置文件进行获取. 创建一个类实现EnvironmentPostProcessor 接口,然后 ...

  8. SQL 将变量定义为Table类型

    ),a2 ,),a4 DATETIME,a5 UNIQUEIDENTIFIER) ,11.22,GETDATE(),NEWID()) ,11.22,GETDATE(),NEWID()) ,11.22, ...

  9. python基础day2

    一.python字符串 字符串是 Python 中最常用的数据类型.可以使用引号('或")来创建字符串 1.1Python访问字符串中的值 Python不支持单字符类型,单字符在 Pytho ...

  10. Linux查看端口号是否使用

    netstat -lntup|grep 80 如果令命无法执行 yum install net-tools