fragment 不重叠

写过类似微博这种tab结构的人都知道,使用的是fragment实现,但是fragment有个问题,就是官方其实没有说明白这个东西到底应该怎么用。比如如果简单的使用rplace来切换tab切换fragment会导致每次都会刷新的问题
使用hide和show显示fragment会带来重叠的问题。

为什么会出现重叠的现象?

因为Activity在内存不足的时候被回收了,再次打开的时候恢复了Activity,之前的Fragment还在Activity中,但是你又重新创建了Fragment,并且Add回去了,所以就重叠了。

怎么解决

一句话,在Activity销毁的时候保存Fragment,在恢复的时候恢复fragment

具体怎么做

  1. 在“onSaveInstanceState()" 使用"FragmentManager"的"putFragment”方法保存到Bundle 中。
  2. 在“onCreate()"中使用"FragmentManager"的"getFragment" 方法重新获取Fragment

示例代码

  @Override
    protected void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
        for (int i = 0 ; i < tabBarView.getChildCount() ; i++){
            int id = tabBarView.getChildAt(0).getId();
            fragmentManager.putFragment(outState,id+"",mFragmentMap.get(id));
        }
        outState.putInt("checkedId", tabBarView.getCheckedRadioButtonId());
    }
        
        
 private void initView(Bundle savedInstanceState) {


        tabBarView.setOnCheckedChangeListener(mFragmentChangeListener);
        if (savedInstanceState != null){
            for (int i = 0 ; i < tabBarView.getChildCount(); i++){
                int id = tabBarView.getChildAt(i).getId();
                mFragmentMap.put(id,fragmentManager.getFragment(savedInstanceState,id+""));
                
  }

补充

一般下面的tab都是使用RadioGroup的,所以你可以使用"setSaveEnable(boolean open)" 来开启保存销毁前的位置