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

  • 相关阅读:
    ssh 使用密钥文件
    VS2015企业版,社区版,专业版详细对比
    Redis 与 数据库处理数据的两种模式(转)
    工业级物联网项目架构设计思想(转)
    C# and Redis,安装作为服务
    C# CRC32
    c++,C# 转换
    app配置智能硬件的解决方案
    C# 与C++的数据转换
    C++ 对数组sizeof 和对数组元素sizeof
  • 原文地址:https://www.cnblogs.com/matoo/p/4842251.html
Copyright © 2011-2022 走看看