• 多个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错误

  • 相关阅读:
    随时积累随手记(持续更新...)
    Zookeeper集群搭建
    Dubbo——基于Zookeeper服务框架搭建及案例演示
    nginx配置浅析
    阿里面试回来,想和Java程序员谈一谈
    博客收藏列表
    启示录:打造用户喜爱的产品
    js深拷贝和浅拷贝
    MyBatis 总结记录
    ActiveMQ初体验
  • 原文地址:https://www.cnblogs.com/matoo/p/4842251.html
Copyright © 2020-2023  润新知