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错误

  • 相关阅读:
    嵌入式GUI FTK介绍(7)主题
    嵌入式GUI FTK介绍(2)两个小应用程序
    嵌入式GUI FTK介绍(8)编译/运行PC模拟版本
    嵌入式GUI FTK介绍(5)在多平台上运行
    嵌入式GUI FTK介绍(4)脚本语言绑定
    嵌入式GUI FTK介绍(3)XML界面描述语言
    活动图
    ASP.NET程序中常用的三十三种代码
    Server的Transfer和Response的Redirect (转)
    .net 点击刷新验证码问题
  • 原文地址:https://www.cnblogs.com/matoo/p/4842251.html
Copyright © 2011-2022 走看看