一个简单无脑的防止内存重启后导致Fragment重叠的解决办法

一个简单无脑的防止内存重启后导致Fragment重叠的解决办法

谈起Fragment,对于开发Android的各位童鞋来说应该是家常便饭了吧。但是不得不说,Fragment的使用要比Activity的使用要复杂一些,使用Fragment摆在我们面前的坑也是很隐蔽,说不定啥时候就一脚踩了上去,还一脸懵逼。哈哈哈哈废话不多说了。
进入正题,相比用replace,hide和show相信大家用得更多吧,那么大家应该或多或少都解决过Fragment重叠的问题,这里来解决一下因为内存重启导致Fragment重叠的问题(如果你是由于逻辑问题导致重叠,那这篇文章就没什么帮助了)
在这里的问题情景如下:如果Activity由于内存吃紧被回收掉了,而重启这个Activity时,由于FragmentMananger重新恢复栈里的Fragment的时候,默认时show的。真因为如此,所以导致了内存重启时Fragment的重叠。另外小提示:建议大家用v4包的Fragment,而不是sdk自带的,为什么呢?向下兼容好很多。当然你本来就是针对5.0或者6.0以上的Android版本开发的就另当别论了。
好吧现在就上干货:
灰常好用的一个BaseFragment

public class BaseFragment extends Fragment {

    private static String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN";
    private static String TAG = BaseFragment.class.getSimpleName();

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            boolean isSupporHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);
            judgeState(isSupporHidden);
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        LogUtil.i(TAG, "BaseFragment create" + this.getId());

        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onDestroy() {
        LogUtil.i(TAG, "BaseFragment destroy" + this.getId());
        super.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        LogUtil.i(TAG, "BaseFragment onSaveInstanceState()---内存重启,保存fragment显示状态");
        outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());//fragment内存异常回收时,保存其显示状态
    }

    /**
     * 判断fragment被意外回收后。也就是内存重启后,是否需要重新显示
     *
     * @param isSupporHidden true-内存重启前改Fragment是hide状态,反之是显示状态
     */
    private void judgeState(boolean isSupporHidden) {
        FragmentTransaction mFragmentTransaction = getFragmentManager().beginTransaction();
        if (isSupporHidden) {
            mFragmentTransaction.hide(this);
        } else {
            mFragmentTransaction.show(this);
        }
        mFragmentTransaction.commit();
    }
}

其次就是要在Activity的onCreate方法中添加判断是:

  // 这里一定要在save为null时才加载Fragment
        // 因为在页面重启时,Fragment会被保存恢复,而此时再加载Fragment会重复加载,导致重叠
        if (savedInstanceState == null) {
            //走正规流程该做的事
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值