zoukankan      html  css  js  c++  java
  • 多个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错误

  • 相关阅读:
    Windows常用命令的使用
    Windows网络命令的相关指令(1)
    HashMap源码解析
    Head First 设计模式【一、设计模式入门】
    软技能-代码之外的生存指南【职业篇】
    记第一个项目结束时的感想
    2019年总结
    深入理解计算机系统【五】-存储器层次结构
    深入理解计算机系统【四】-程序的机器级表示
    深入理解计算机系统【三】
  • 原文地址:https://www.cnblogs.com/matoo/p/4842251.html
Copyright © 2011-2022 走看看