美文网首页
页面崩溃导致Fragment再次启动页面重叠

页面崩溃导致Fragment再次启动页面重叠

作者: Kalac | 来源:发表于2019-01-23 13:02 被阅读0次

问题描述:

在使用fragment时,如果程序崩溃导致页面重启,会出现页面重叠现象

问题gif图:

页面重叠问题

问题原因:

1、首页Fragment在切换时,使用了show()和hide()方法。当出现崩溃时,首页MainActivity被销毁,此时,onSaveInstanceState() 方法会将相关数据进行保存。

2、重启App进入MainActivity中,onCreate(Bundle savedInstanceState) 方法,通过savedInstanceState 将之前保存的数据进行了恢复。

3、这种情况下,崩溃前show的Fragment 通过addFragment方式重新加载,从而导致fragment的show()和hide()方法失效,从而出现重叠效果。

解决方法:

在addFragment的时候添加一个tag

在onCreate()方法中对savedInstanceState参数进行判断,如果不为空,那么就用tag获取fragment,显示出来即可

具体代码

显示Fragment逻辑


public void showFragment(Fragment fragment) {
        String tag;
        if (fragment instanceof MainPagerFragment) {
            tag = "main";
        } else {
            tag = "study";
        }
        //开启事务 创建事务对象
        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
        //如果之前没有添加过
        if (!fragment.isAdded()) {
            fragmentTransaction.add(R.id.home_content,fragment,tag);
            if (currentFragment != null) {
                //隐藏fragment
                fragmentTransaction.hide(currentFragment);
            }
        } else {
            if (currentFragment != null) {
                fragmentTransaction.hide(currentFragment);
            }
            fragmentTransaction.show(fragment);
        }
        //全局变量,记录当前显示的fragment
        currentFragment = fragment;
        fragmentTransaction.commit();
    }

onCreate

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        mFragmentManager = getSupportFragmentManager();
        if (savedInstanceState != null) {
            mainPagerFragment = mFragmentManager.findFragmentByTag("main");
            studyPagerFragment = mFragmentManager.findFragmentByTag("study");
            showFragment(mainPagerFragment);
        }
        initView();

    }

initView

        setContentView(R.layout.activity_home);
        if (mainPagerFragment == null) {
            mainPagerFragment = new MainPagerFragment();
        } 
        if (studyPagerFragment == null) {
            studyPagerFragment = new StudyPagerFragment();
        }
        showFragment(mainPagerFragment);

问题解决

最终效果

相关文章

网友评论

      本文标题:页面崩溃导致Fragment再次启动页面重叠

      本文链接:https://www.haomeiwen.com/subject/ceujjqtx.html