今天还是讲解Fragment, Fragment是每一个APP必不可少的东西,他的坑也很多,所以今天就为程序员们说一下Fragment重叠问题的坑。
很多人都使用过Fragment,简单的使用是最基本的。可是什么是Fragment重叠是什么?
说一个应用场景:在一个activity中有四个Fragment,当我们在切换其他activity时,在别的app停留太长时间时,回到这个Activity中;
就会出现Fragment重叠;
重叠的原因是什么?
当系统内存不足,Fragment的宿主activity回收的时候,但是Fragment并没有被回收,activity被系统回收时会调用onSaveInstanceState()方法保存状态,此时的FragmentTransaction中的相当于再次add()了Fragment进去,hide()和show()方法对之前保存的Fragment已经失效,所以就出现了重叠
总结原因可以分为三点:
1.系统内存不足 activity被回收
2.重写onSaveInstanceState()保存状态
3,fragment 状态会是默认show()
造成fragment重叠
解决办法是什么?
在fragment基类中 把状态进行保存
通过保存的状态 fragment子类会进行相应的显示隐藏
以下是代码:
public
class
BaseFragment
extends
Fragment {
private
static
final
String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN";
@Override
public
void
onCreate(@Nullable Bundle savedInstanceState) {
. ..
if
(savedInstanceState !=
null
) {
boolean
isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);
FragmentTransaction ft = getFragmentManager().beginTransaction();
if
(isSupportHidden) {
ft.hide(
this
);
}
else
{
ft.show(
this
);
}
ft.commit();
}
@Override
public
void
onSaveInstanceState(Bundle outState) {
outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());
}
}
以上是解决的办法,但是解决的办法不是唯一的,我们可以根据造成Fragment重叠的原因,做相对的处理,
本次只是提供一种解决办法;