多个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 @ 2015-09-27 14:59  保安保安  阅读(628)  评论(0编辑  收藏  举报