多个Fragment在屏幕翻转会重影问题的解决

fragment使用add和hide而不用replace的方法添加到activity中,如果屏幕翻转可能会又add新的fragment进去,所以会重影。

如果有一个sparsearray保存fragment,那么在初始化的时候就应该用

复制代码
    private void initFragment(Bundle savedInstanceState) {
        //set up fragments
//        fragments.append(MAIN_INDEX, MainFragment.newInstance());
//        fragments.append(SUCCESS_INDEX, SuccessFragment.newInstance());
//        fragments.append(FAILED_INDEX, FailedFragment.newInstance());
//        fragments.append(NONE_INDEX, NoneFragment.newInstance());
        fragments = new SparseArray<>();
        //Main Fragment
        Fragment mainFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(MAIN_INDEX));
        if (mainFragment == null) {
            mainFragment = MainFragment.newInstance();
        }
        fragments.append(MAIN_INDEX, mainFragment);
        //Success Fragment
        Fragment succcessFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(SUCCESS_INDEX));
        if (succcessFragment == null) {
            succcessFragment = SuccessFragment.newInstance();
        }
        fragments.append(SUCCESS_INDEX, succcessFragment);
        //Failed Fragment
        Fragment failedFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(FAILED_INDEX));
        if (failedFragment == null) {
            failedFragment = FailedFragment.newInstance();
        }
        fragments.append(FAILED_INDEX, failedFragment);
        //none Fragment
        Fragment noneFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(NONE_INDEX));
        if (noneFragment == null) {
            noneFragment = NoneFragment.newInstance();
        }
        fragments.append(NONE_INDEX, noneFragment);
        //add to activity
        for (int i = 0; i < fragments.size(); i++) {
            Fragment f = fragments.valueAt(i);
            if (!f.isAdded())
                getSupportFragmentManager()
                        .beginTransaction()
                        .add(R.id.container, f, String.valueOf(fragments.keyAt(i)))
                        .hide(f)
                        .commit();
        }
    }
复制代码

不直接append新的fragment,而是通过fragmentsupportmanager先检查有没有已有的fragment,这样就可以解决重影问题。

需要注意的是:setRetainInstance(true)必须设置,这样fragment才不会在manager中销毁,替换fragment后想修改数据才不会出现nullpointerexception错误

posted @   保安保安  阅读(636)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示