fragment 不重叠
写过类似微博这种tab结构的人都知道,使用的是fragment实现,但是fragment有个问题,就是官方其实没有说明白这个东西到底应该怎么用。比如如果简单的使用rplace来切换tab切换fragment会导致每次都会刷新的问题
使用hide和show显示fragment会带来重叠的问题。
为什么会出现重叠的现象?
因为Activity在内存不足的时候被回收了,再次打开的时候恢复了Activity,之前的Fragment还在Activity中,但是你又重新创建了Fragment,并且Add回去了,所以就重叠了。
怎么解决
一句话,在Activity销毁的时候保存Fragment,在恢复的时候恢复fragment
具体怎么做
- 在“onSaveInstanceState()" 使用"FragmentManager"的"putFragment”方法保存到Bundle 中。
- 在“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)" 来开启保存销毁前的位置