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

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

作者: 花花是男神 | 来源:发表于2018-06-01 14:21 被阅读0次

一个简单无脑的防止内存重启后导致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) {
//走正规流程该做的事
}

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/tzxksftx.html