一个简单无脑的防止内存重启后导致Fragment重叠的解决办法
谈起Fragment,对于开发Android的各位童鞋来说应该是家常便饭了吧。但是不得不说,Fragment的使用要比Activity的使用要复杂一些,使用Fragment摆在我们面前的坑也是很隐蔽,说不定啥时候就一脚踩了上去,还一脸懵逼。哈哈哈哈废话不多说了。
进入正题,相比用replace,hide和show相信大家用得更多吧,那么大家应该或多或少都解决过Fragment重叠的问题,这里来解决一下因为内存重启导致Fragment重叠的问题(如果你是由于逻辑问题导致重叠,那这篇文章就没什么帮助了)
在这里的问题情景如下:如果Activity由于内存吃紧被回收掉了,而重启这个Activity时,由于FragmentMananger重新恢复栈里的Fragment的时候,默认时show的。真因为如此,所以导致了内存重启时Fragment的重叠。另外小提示:建议大家用v4包的Fragment,而不是sdk自带的,为什么呢?向下兼容好很多。当然你本来就是针对5.0或者6.0以上的Android版本开发的就另当别论了。
好吧现在就上干货:
灰常好用的一个BaseFragment
public class BaseFragment extends Fragment {
private static String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN";
private static String TAG = BaseFragment.class.getSimpleName();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
boolean isSupporHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);
judgeState(isSupporHidden);
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
LogUtil.i(TAG, "BaseFragment create" + this.getId());
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDestroy() {
LogUtil.i(TAG, "BaseFragment destroy" + this.getId());
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
LogUtil.i(TAG, "BaseFragment onSaveInstanceState()---内存重启,保存fragment显示状态");
outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());//fragment内存异常回收时,保存其显示状态
}
/**
* 判断fragment被意外回收后。也就是内存重启后,是否需要重新显示
*
* @param isSupporHidden true-内存重启前改Fragment是hide状态,反之是显示状态
*/
private void judgeState(boolean isSupporHidden) {
FragmentTransaction mFragmentTransaction = getFragmentManager().beginTransaction();
if (isSupporHidden) {
mFragmentTransaction.hide(this);
} else {
mFragmentTransaction.show(this);
}
mFragmentTransaction.commit();
}
}
其次就是要在Activity的onCreate方法中添加判断是:
// 这里一定要在save为null时才加载Fragment
// 因为在页面重启时,Fragment会被保存恢复,而此时再加载Fragment会重复加载,导致重叠
if (savedInstanceState == null) {
//走正规流程该做的事
}