您的位置:首页 > 移动开发 > Android开发

一个简单无脑的防止内存重启后导致Fragment重叠的解决办法

2017-08-20 16:27 471 查看

一个简单无脑的防止内存重启后导致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) {
//走正规流程该做的事
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 内存 fragment
相关文章推荐