尊重他人劳动成果,转载请说明出处:http://blog.csdn.net/bingospunky/article/details/46847269

需求

在搭界面有这么样一个需求:须要两层的Fragment嵌套,内层须要滑动切换效果,外层界面不须要滑动效果。

那么内层使用ViewPager切换,外层就使用replace切换。这样搭出来的界面不能得到须要的效果,内层的Fragment仅仅有第一次能显示内容。之后切换外层Fragment时。内层Fragent都是空着的。

我再尝试两层Fragment都使用replace切换,这样就能达到效果了。可是项目里须要内层须要滑动切换的效果。对于这种情况能够略微改动一下需求,取消内层滑动效果的需求就ok了。可是作为一个求甚解的人,我还是想尝试一下实现内层滑动效果。那么怎么实现呢?

show and hide

在切换外层Fragment时使用的是replace。被切换掉的Fragment的生命周期函数会运行到onDestroy。

我推測内层的Fragment空着是由于被切换掉到Fragment在运行onDestroy函数时,对FragmentManager做了一些不可告人的事情导致的。那么我们能够选择不运行onDestroy的方式切换。那么就选择show/hide进行切换外层Fragment。这个方式是可行的可是会产生一个新的问题。

当进程被杀死以后

比方一个activity已经add了4个Fragment,我们在切换的时候使用show/hide切换。假设这个时候按home键返回桌面。在之后的一段时间里,由于内存的原因。这个应用的进程被系统杀死了,然后我们通过长按home键回到这个应用。那么系统会创建一个新的activity给我们。在系统创建的新的activity里。不能非常好的还原刚才已经add的4个Fragment。在界面里还是会有4个Fragment(假设Fragment没有背景色,那么这4个Fragment会重叠在一起),而且切换事件也不响应。那么我们怎么解决问题呢?首先我们要对这个问题进行定性,当我们给activity加入多个Fragment且该应用被系统杀死后又一次创建时,多个Fragment会出现异常。

当我们出现这样的情况时,能够finish掉这个activity。由于这样的情况非常少出现。所以问能够finish这个activity。

最后

这篇文章仅仅是介绍了我遇到的两层Fragment嵌套的问题,以及我解决这个问题的表面现象。刚才我也尝试了一下去读Fragment的源代码,可是还没有进展。在接下来的时间我会阅读这部分的源代码,然后从源代码到角度找到上面两个问题(1.两层Fragment切换时。为什么内层Fragment不显示?2.activity被系统杀死。又一次生成时,为什么Fragmant会重叠且不响应切换?)的原因,就像我前面的从源代码角度解决这个问题一样。

最后的最后

转眼,已经凌晨四点半了,凌晨四点半的五道口非常安静。非常美。

两层Fragment嵌套,外层Fragment切换时内层Fragment不显示内容的更多相关文章

  1. 【转】Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法

    重构了下之前自己的一个新闻客户端,全部使用了Fragment来进行页面切换,只有一个入口Activity作为程序的启动Activity,其中有一个界面需要调用摄像头识别二维码, 于是就会用到Surfa ...

  2. Fragment之间通过add切换时的显示与隐藏

    新手,不知道用什么方法实现 ,通过动态的方法显示了Fragment   A,在这个里面点击列表项时add方法动态加载Fragment  B,但是两者都会一起显示,重叠在一起了,如果用replace方法 ...

  3. [Android Pro] Fragment中使用SurfaceView切换时闪一下黑屏的解决办法

    方法一.在Activity的onCreate中添加如下代码 getWindow().setFormat(PixelFormat.TRANSLUCENT); reference to :  http:/ ...

  4. 例题:打印乘法口诀。可能大家一看有点难,但只要理解for 循环嵌套,两层循环,外层循环行数,里层循环列数,搞清楚行数和列数之间的关系,就可以轻松做出这道题

    namespace 打印乘法口诀{    class Program    {        static void Main(string[] args)        {            f ...

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

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

  6. 两层fragment嵌套时出现空白,(收藏别人的)

    完美解决 两层Fragment,内层空白 转载:http://blog.csdn.net/bingospunky/article/details/51352400 目录(?)[+] 前言 两层Frag ...

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

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

  8. Activity嵌套多个Fragment实现横竖屏切换

    一.上图 二.需求 最近项目遇到个横竖屏切换的问题.较为复杂.在此记之. 1.Activity中竖屏嵌套3个Fragment,本文简称竖屏FP1,FP2,FP3. 2.当中竖屏FP1与FP2能够切换为 ...

  9. 实现Fragment 切换时不重新实例化

    以前实现Fragment的切换都是用replace方法实现 public void startFragmentAdd(Fragment fragment) { FragmentManager frag ...

随机推荐

  1. Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置

    由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lifecycle.Goal).用法(Archetype意义及创建各种项目).maven常 ...

  2. php中遇到include_path='.;C:\php5\pear'的错误

    所有面页,包括空白的都会报类似下面的错误. Warning: Unknown: failed to open stream: No such file or directory in Unknown  ...

  3. debug(fmt,args...)调试

    1.定义宏(debug.h) #ifndef __DEBUG__H #define __DEBUG__H #include <stdio.h> #ifdef DEBUG #define d ...

  4. 无聊拿socket写的100以内的加法考试。。。

    用的广播IP,所以校内网不用设置,直接在校内网随便找台电脑打开服务端,然后再随便找台电脑打开客户端,然后就可以做100以内的加法了... 说明:客户端输入“ready”,服务端会随机发送一条加法算式, ...

  5. MVC架构学习

    作为一名小小的GreenBird,学习MVC呢,已经花费了2天了,期间得到了美丽的学姐的帮助,初步整理了一下. 首先,学习MVC呢就先以一个标准的MVC的简单的例子来入手,然后根据学姐的PPT,我用v ...

  6. tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

    P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着 ...

  7. Hdu5517 Triple

    Description Given the finite multi-set \(A\) of \(n\) pairs of integers, an another finite multi-set ...

  8. [Codeforces Round #296 div2 D] Clique Problem 【线段树+DP】

    题目链接:CF - R296 - d2 - D 题目大意 一个特殊的图,一些数轴上的点,每个点有一个坐标 X,有一个权值 W,两点 (i, j) 之间有边当且仅当 |Xi - Xj| >= Wi ...

  9. encodeURL() vs encodeRedirectURL()

    当用URL重写方式来管理Session的时候,通过以上两个方法把session ID写到URL中.不同点是:两个方法确定是否需要包含session ID的逻辑不同.在调用HttpServletResp ...

  10. Codeforces Round #205 (Div. 2) : C

    感觉像是一个数位dp,高位的1如果不选的话,前面低位的数都可以选:不然只能选择为1的数: 代码: #include<iostream> #include<algorithm> ...