解决 Fragment 重叠问题

Fragment 重叠问题的产生

因为某些原因(例如旋转屏幕)而导致 Activity 发生重建时,Fragment 也会发生重建。重建的 Fragment 如果没有保存状态,那么它的 mHidden 默认为 false,即 hide 失效,这时所有添加到容器的 Fragment 都会显示出来,就产生了重叠现象。

解决问题

要解决 Fragment 的重叠问题,关键是要在 Activity 发生重建时保存 Fragment 的状态,这就可以利用 Activity 的 onSaveInstanceState 方法:

    private static final String KEY_FG_A = "fg_a";
    private static final String KEY_FG_B = "fg_b";
    private static final String KEY_FG_C = "fg_c";
    
    private FragmentManager mFragmentManager = getSupportFragmentManager();
    // 假设有以下三个 Fragment
    private Fragment mFragmentA;
    private Fragment mFragmentB;
    private Fragment mFragmentC;

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // 保存已创建的 Fragment
        if (mFragmentA != null) {
            mFragmentManager.putFragment(outState, KEY_FG_A, mFragmentA);
        }
        if (mFragmentB != null) {
            mFragmentManager.putFragment(outState, KEY_FG_B, mFragmentB);
        }
        if (mFragmentC != null) {
            mFragmentManager.putFragment(outState, KEY_FG_C, mFragmentC);
        }
    }

然后在 onCreate 方法中判断 savedInstanceState 是否为空,不为空说明 Activity 发生了重建,需要恢复 Fragment:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
	    
		if (savedInstanceState != null) {
            // 取出保存的 Fragment
            mFragmentA = mFragmentManager.getFragment(savedInstanceState, KEY_FG_A);
            mFragmentB = mFragmentManager.getFragment(savedInstanceState, KEY_FG_B);
            mFragmentC = mFragmentManager.getFragment(savedInstanceState, KEY_FG_C);
		} else {
			// 第一次 onCreate 时的操作,例如显示第一个 Fragment
			// ...
		}

    }

这时恢复的 Fragment 就保存了原来的状态,屏幕只会显示一个 Fragment,不会出现重叠的现象。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值