`

关于Fragment重叠异常的问题

阅读更多

本文内容参考来源于:http://www.jianshu.com/p/d9143a92ad94

 

一、说明

    在Activity中添加Fragment几乎是很多app都需要使用到的,原因就是Fragment可以在现有基础上使性能大幅度提高,并且占用内存降低,同样的界面Activity占用内存比Fragment要多,响应速度Fragment比Activty在中低端手机上快了很多,甚至能达到好几倍!如果你的app当前或以后有移植平板等平台时,可以让你节省大量时间和精力。但是Fragment本身就不是完美的,它存在很多的缺陷,今天要说的这个就是我在实际开发中遇到的一个问题,我在一个Activity中放置了三个Fragment,界面与QQ类似,下方是三个按钮用于切换三个Fragment的显示与隐藏,但是在系统内存等一些意外情况下,Fragment的显示居然重叠了,而且无论怎么切换重叠的Fragment就是不隐藏掉。于是乎,就不得不去网上找各类资料了,上方的参考源就是我觉得介绍的非常详细的一部分,当然为了便于记忆整理,我也抽取了中间重叠的一小部分记录下来。

 

二、原因

    如果你add()了几个Fragment,使用show()、hide()方法控制,比如微信、QQ的底部tab等情景,如果你什么都不做的话,在“内存重启”后回到前台,app的这几个Fragment界面会重叠。

    原因是FragmentManager帮我们管理Fragment,当发生“内存重启”,他会从栈底向栈顶的顺序一次性恢复Fragment;


    但是因为没有保存Fragment的mHidden属性,默认为false,即show状态,所以所有Fragment都是以show的形式恢复,我们看到了界面重叠。
(如果是replace,恢复形式和Activity一致,只有当你pop之后上一个Fragment才开始重新恢复,所有使用replace不会造成重叠现象)

 

    还有一种场景,addreplace都有可能造成重叠: 在onCreate中加载Fragment,并且没有判断saveInstanceState==null,导致重复加载了同一个Fragment导致重叠。(PS:replace情况下,如果没有加入回退栈,则不判断也不会造成重叠,但建议还是统一判断下)

 

以上是作者原文提到的,我这里试了几种方法,觉得还是标准写法比较好,附上代码:

 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    TargetFragment targetFragment;
    HideFragment hideFragment;

    if (savedInstanceState != null) {  // “内存重启”时调用
        targetFragment = getSupportFragmentManager().findFragmentByTag(TargetFragment.class.getName);
        hideFragment = getSupportFragmentManager().findFragmentByTag(HideFragment.class.getName);
        // 解决重叠问题
        getFragmentManager().beginTransaction()
                .show(targetFragment)
                .hide(hideFragment)
                .commit();
    }else{  // 正常时
        targetFragment = TargetFragment.newInstance();
        hideFragment = HideFragment.newInstance();

        getFragmentManager().beginTransaction()
                .add(R.id.container, targetFragment, targetFragment.getClass().getName())
                .add(R.id,container,hideFragment,hideFragment.getClass().getName())
                .hide(hideFragment)
                .commit();
    }
}

 

 

三、补充

    标准写法显然是在onCreate的时候就初始化了Fragment并且添加到了FragmentManager,但是如果项目其他地方需要切换显示的话,一定要先判断fragment是否为null,如果不为null的情况下,再去调用getFragmentManager().beginTransaction().add(R.id.container, targetFragment, targetFragment.getClass().getName()).hide(hideFragment).commit();的话就会出现重复添加Fragment的错误,再有一次就是可以将最后的commit()方法替换成commitAllowingStateLoss(),至于原因,android源码中有提到:

 

/**
     * Schedules a commit of this transaction.  The commit does
     * not happen immediately; it will be scheduled as work on the main thread
     * to be done the next time that thread is ready.
     *
     * <p class="note">A transaction can only be committed with this method
     * prior to its containing activity saving its state.  If the commit is
     * attempted after that point, an exception will be thrown.  This is
     * because the state after the commit can be lost if the activity needs to
     * be restored from its state.  See {@link #commitAllowingStateLoss()} for
     * situations where it may be okay to lose the commit.</p>
     * 
     * @return Returns the identifier of this transaction's back stack entry,
     * if {@link #addToBackStack(String)} had been called.  Otherwise, returns
     * a negative number.
     */
    public abstract int commit();

 

 

 

分享到:
评论

相关推荐

    Android关于Fragment重叠问题分析和解决

    4. 使用`onBackStackChangedListener`:监听BackStack变化,确保在正确的时机更新Fragment状态,防止因回退栈操作引发的重叠问题。 5. 更新UI:在Fragment的`onResume()`方法中更新UI,确保每次显示时Fragment的视图...

    Android中Fragment管理及重叠问题的解决方法

    本文将深入探讨Fragment的管理以及如何解决Fragment重叠问题。 首先,Fragment是在Android 3.0(API级别11)引入的,它的主要用途是增强Activity的功能,特别是在Tab导航设计中,每个Tab对应一个Fragment,使得...

    关于Fragment重叠问题分析和解决

    Fragment重叠问题通常出现在以下几种情况: 1. **布局嵌套不当**:当Fragment被添加到一个已经包含其他Fragment的布局时,如果没有正确设置容器,可能会导致重叠。比如,如果两个Fragment都被添加到同一个...

    Fragment重叠解决方案

    Fragment重叠问题产生的原因多种多样,主要包括以下几点: 1. **错误的Transaction管理**:当使用FragmentManager进行Fragment操作时,如果没有正确管理Transaction,可能导致多个Fragment同时存在。例如,没有使用...

    Fragment多个的切换重叠问题解决

    本篇文章将深入探讨Fragment重叠问题的成因,并提供有效的解决方案。 **问题成因** 1. **不正确的添加或替换操作**:当在同一个Transaction中,错误地同时添加和替换Fragment,可能会导致重叠现象。例如,没有正确...

    FragmentDemo修改了切屏重叠问题

    guolin的fragmentdemo, 修改了切屏时重叠问题, AndroidManifest 加入 android:configChanges="keyboardHidden|orientation|screenSize" 即可

    Android中Fragment 重叠遮盖问题解决办法

    Android中Fragment重叠遮盖问题解决办法 在Android开发中,Fragment重叠遮盖问题是一个常见的问题,而解决这个问题需要了解Fragment的生命周期和状态保存机制。下面将详细介绍Fragment重叠遮盖问题的成因和解决办法...

    根据霖神FragmentDemo解决重叠问题

    本示例“霖神FragmentDemo”着重解决了一个常见的问题:Fragment在屏幕旋转时出现的重叠问题。 首先,我们需要理解为什么Fragment会遇到重叠问题。在Android中,当设备屏幕方向发生变化(例如从竖屏转为横屏),...

    Android Activity内嵌Fragment,当Activity recreate时Fragment被添加多次,造成界面重叠

    然而,在使用Fragment时,有时会出现一个问题:当Activity由于配置更改(如屏幕旋转)等原因需要重建(recreate)时,内嵌的Fragment可能会被不正确地添加多次,导致界面重叠。这个问题通常与如何管理和恢复Fragment...

    Fragment使用show和hine切换,避免Activity回收后Fragment重叠问题;

    Fragment+RadioGroup经典的主界面布局,简单明了方便实用,使用show和hine切换,并有效避免FragMent重叠问题;https://blog.csdn.net/qq_35605213/article/details/79713524

    android Fragment功能简单测试

    在这个“android Fragment功能简单测试”中,我们将深入探讨Fragment的使用以及如何通过add和replace方法来解决Fragment重叠的问题。 Fragment作为Activity的一部分,可以有自己的生命周期和用户界面。它们可以单独...

    FragmentDemo

    FragmentDemo项目显然着重展示了如何利用Fragment来实现一个Tab切换的效果,并且处理了横竖屏切换时Fragment重叠的问题。下面将详细探讨Fragment的核心概念、Tab切换的实现以及横竖屏切换时的保存状态策略。 1. **...

    Fragment切换(VIewPager管理)

    4. **处理页面重叠问题**:有时,当快速滑动ViewPager时,可能会出现页面重叠的现象。这通常是因为动画设置不当或者适配器没有正确地更新页面。确保在适配器中正确更新`notifyDataSetChanged()`,并在Fragment的布局...

    tabFragment

    采用的是add hide的办法去隐藏fragment和显示fragment,避免了页面重叠的问题 博客链接:http://blog.csdn.net/oaitan/article/details/51165648

    内外嵌套的Fragment

    7. **处理布局冲突**:由于多层嵌套,可能会出现布局重叠问题。通过调整布局参数和权重,或者使用`setCustomAnimations()`来设置动画,可以优化用户体验。 8. **解决编码乱码问题**:如果遇到编码问题,可以确保...

    fragment切换卡+xutil的加载网络图片

    2. **过度绘制**:当多个Fragment在同一屏幕上重叠绘制,或者Fragment内部有复杂的布局时,可能会导致设备绘制负担过重,影响性能。 3. **内存管理问题**:如果Fragment之间没有正确管理资源,比如内存泄漏,可能...

    Fragment里面点击button跳转及DrawLayout Framelayout冲突

    在阅读提供的博文链接后,你可以找到更多关于这个问题的具体解决方案和代码示例。总之,理解和熟练运用Fragment、Button的点击事件、DrawerLayout以及FrameLayout的特性,是解决这类问题的关键。同时,持续学习和...

    Android Fragment多层嵌套重影问题的解决方法

    然而,当Fragment进行多层嵌套时,可能会遇到一个棘手的问题——重影现象。本文将深入探讨这个问题,提供解决思路,并分析其产生的原因及解决方案。 首先,解决bug的思想是解决问题的关键。在面对重影问题时,...

Global site tag (gtag.js) - Google Analytics