Fragment重叠原因:

  App因某种原因崩溃自动重启,或App长期在后台运行Fragment依赖的activity被回收等等原因;当系统内存不足,Fragment 的依附Activity 被回收的时,Fragment 的实例并没有随之被回收。Activity被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层,当Activity通过再次被重建时,之前被实例化过的 Fragment 会出现在Activity中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了,所以就出现了重叠;

 

复现BUG:

设置 -- 开发者选项 -- 不保留活动(打开);这样设置后按HOME键Activity就会被回收。

方式一:(不推荐使用)

Activity被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层;简单粗暴:不让它保存;

@Override
    protected void onSaveInstanceState(Bundle outState) {
     //不保存之前的fragment的状态
//        super.onSaveInstanceState(outState);
    }

方式二:(推荐使用)

重写onAttachFragment,重新让新的Fragment指向了原本未被销毁的fragment;

@Override
public void onAttachFragment(Fragment fragment) {
    //重新让新的Fragment指向了原本未被销毁的fragment,它就是onAttach方法对应的Fragment对象
    if (HomeFm == null && fragment instanceof Fragment1)
        HomeFm = fragment;
    if (SpcFm == null && fragment instanceof Fragment2)
        SpcFm = fragment;
    if (OrderFm == null && fragment instanceof Fragment3)
        OrderFm = fragment;
    if (MyFm == null && fragment instanceof Fragment4)
        MyFm = fragment;
    super.onAttachFragment(fragment);
}

方式三:(推荐使用)

在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉;

 */
protected void onSaveInstanceState(Bundle outState) {
    //在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉。
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.remove(HomeFm);
    transaction.remove(SpcFm);
    transaction.remove(OrderFm);
    transaction.remove(MyFm);
    transaction.commitAllowingStateLoss();
    super.onSaveInstanceState(outState);
}

方式四:

Fragment保存自己是否显示;

 

public class BaseFragment extends Fragment {
    /**
     * FragmentState没帮我们保存Hidden状态,那就我们自己来保存,在页面重启后,我们自己来决定Fragment是否显示!
     */
    private static final String STATE_SAVE_IS_HIDDEN = "CCB_IS_HIDDEN";
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            if (isSupportHidden) {
                ft.hide(this);
            } else {
                ft.show(this);
            }
            ft.commit();
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());
    }
}

 

随意门:Fragment+Radiogroup联动

 

 

 

posted on 2018-03-27 15:38  香蕉你个博纳纳  阅读(2030)  评论(0)    收藏  举报