解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题
最近在做一个android 项目,需要实现在同一个Activity之间切换的功能(类似于微信)。然而,在实现后,发现会出现Fragment重叠的问题。参考网上的解决方法,解决了此问题,分享给大家。
当该Activity由于长时间占用内存或者由于内存不足时,而被系统收回内存,就容易出现Fragment重叠的问题。
解决方法
出现上述问题的原因是,当由于某些原因,系统销毁掉该Activity后,重新启动该Activity而出现重叠问题。那么,我们可以利用onSaveInstanceState()函数的特性,当Activity被系统销毁掉时,保存当前Activity中显示Fragment的TAG值。若启动时,再show被保存TAG的Fragment。
注意:onSaveInstanceState()函数并不是生命周期方法,只有在应用遇到意外情况(如内存不足等),而被系统销毁时,才会调用该方法。而当用户按back键退出时,不会调用该方法。
现在,解决这个问题的主要思路有了,我们看看具体如何实现。
1. 为每个Fragment设置TAG值。
private void setSelect(int i) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
hideFragment(transaction);
// setTab(i);
// mViewPager.setCurrentItem(i);
// 把图片设置为亮的
// 设置内容区域
switch (i) {
case 0:
if (mTab01 == null) {
mTab01 = new HomeFragment();
//设置tag值
**transaction.add(R.id.id_content, mTab01,TAG_FRAGMENT[0]);**
} else {
transaction.show(mTab01);
}
setTitle("旅行管家");
setHome();
mImgHome.setImageResource(R.drawable.icon_dilan_shouye);
break;
case 1:
if (mTab02 == null) {
mTab02 = new PersonalFragment();
transaction.add(R.id.id_content, mTab02, TAG_FRAGMENT[1]);
} else {
transaction.show(mTab02);
}
setTitle("我的");
setPersonal();
mImgPersonal.setImageResource(R.drawable.icon_dilan_wode);
break;
case 2:
if (mTab03 == null) {
mTab03 = new FriendFragment();
transaction.add(R.id.id_content, mTab03,TAG_FRAGMENT[2]);
} else {
transaction.show(mTab03);
}
setTitle("通讯录");
mImgFriend.setImageResource(R.drawable.icon_dilan_tongxulu);
break;
case 3:
if (mTab04 == null) {
mTab04 = new FindFragment();
transaction.add(R.id.id_content, mTab04,TAG_FRAGMENT[3]);
} else {
transaction.show(mTab04);
}
setTitle("发现");
mImgFind.setImageResource(R.drawable.icon_dilan_faxian);
break;
case 4:
if (mTab05 == null) {
mTab05 = new ShopFragment();
transaction.add(R.id.id_content, mTab05,TAG_FRAGMENT[4]);
} else {
transaction.show(mTab05);
}
setTitle("优选");
mImgShop.setImageResource(R.drawable.icon_dilan_youxuan);
break;
default:
break;
}
transaction.commit();
}
- 重写onSaveInstanceState()函数,保存Fragment的tag值。
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(SAVED_INDEX, index);
super.onSaveInstanceState(outState);
}
- 在初始化布局后,判断onCreate(Bundle savedInstanceState)方法中的savedInstanceState是否为
null
,若不为null
,则获取意外销毁后由onSaveInstanceState()保存的tag值,根据tag值,找到Fragment。
注意:由onSaveInstanceState()保存的数据(在Activity被意外销毁之前),可以由onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initViews();
fragmentManager = getSupportFragmentManager();
if(savedInstanceState != null){
index = savedInstanceState.getInt(SAVED_INDEX,index);
mTab01 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[0]);
mTab02 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[1]);
mTab03 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[2]);
mTab04 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[3]);
mTab05 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[4]);
}
setSelect(index);
}