- 记使用碎片fragment时,造成页面错乱,重叠显示
原因
- 使用fragment时,为了防止重复replace,导致fragment每次都重新创建,重新获取数据,导致不必要的流量损失,所以一般使用hide和show来实现,但是这样会带来一个问题,就是当页面奔溃,然后自动打开当前主页面时,会发现几个不同的fragment页面错乱重叠了,或者在进行分屏时,也会出现这种情况。
解决办法
- 之前看见别人的一篇博客,我忘记了是谁的博客,这里在记录一下,完全没有侵权的意思,如有冒犯,请正主留言我加上博客地址。
- 解决方案:
- 1.在存放fragment的Activity中的onSaveInstance方法中进行保存当前选中的fragment信息
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt("nowSelectedPage",index);
super.onSaveInstanceState(outState);
}
- 注解:在outState这个bundle中保存当前选中的页面信息,存放key——value值
- 2.在存放fragment的Activity中的onCreate方法中判断savedInstanceState是否为空,如果不为空,说明上次是错误关闭页面,保存了选中的页面信息
@Override
protected void onCreate(Bundle savedInstanceState) {
pages = new HashMap<>();
super.onCreate(savedInstanceState);
fragmentManager = getSupportFragmentManager();
if (savedInstanceState != null) {
//读取上一次界面Save的时候tab选中的状态,默认是选中第一个
lastIndex=savedInstanceState.getInt("nowSelectedPage",0);
pages.put(PageEnum.HOME_PAGE,fragmentManager.findFragmentByTag(FRAGMENT_TAG[0]));
pages.put(PageEnum.BOARD_PAGE,fragmentManager.findFragmentByTag(FRAGMENT_TAG[1]));
pages.put(PageEnum.FOLLOW_PAGE,fragmentManager.findFragmentByTag(FRAGMENT_TAG[2]));
pages.put(PageEnum.MINE_PAGE,fragmentManager.findFragmentByTag(FRAGMENT_TAG[3]));
}
// 选中index
setTabSelection(lastIndex);
}
- 3.在每个fragment初始化后添加进入事务,并且加入tag,保证后面通过tag取出fragment。
transaction.add(R.id.fl_main,homeFragment,FRAGMENT_TAG[0]);
transaction.add(R.id.fl_main,boardFragment,FRAGMENT_TAG[1]);
transaction.add(R.id.fl_main,followFragment,FRAGMENT_TAG[2]);
transaction.add(R.id.fl_main,mineFragment,FRAGMENT_TAG[3]);
这样操作后,fragment就不会再出现错乱重叠的情况。
!!!这是之前看见别人的一篇博客,我忘记了是谁的博客,这里在记录一下,完全没有侵权的意思,如有冒犯,请正主留言我加上博客地址。
网友评论