网上找到一篇帖子说在应用退到后台后,系统会在内存不足时将应用回收掉,再次启动应用会出现Activity中的Fragment重叠现象,其实出现问题的原因是这样的,在回收应用回收前FragmentActivity会调用onSaveInstanceState(Bundle outState) 方法,保存当前的Fragment的状态。所以需要在FragMent里的onCreate里将savedInstanceState相应的Parcelable重新置为空,跟了一下代码确实也是和描述的一致,但是现在不知道savedInstanceState.utParcelable(@Nullable String key, @Nullable Parcelable value) 第一个参数应该怎么写,或者从哪获取呢?
原文链接:https://blog.csdn.net/songmingzhan/article/details/84452610
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
// super.onSaveInstanceState(outState);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
if(savedInstanceState!=null)
{
if (BuildConfig.DEBUG) Log.d("TabViewPtz", "这是恢复的页面"+savedInstanceState);
savedInstanceState.putParcelable(这里的key应该写什么,从哪获得,null);
}
else {
if (BuildConfig.DEBUG) Log.d("TabViewPtz", "这是正常的创建");
}
super.onCreate(savedInstanceState);
}
安卓开发不久,这应该是个基础问题,希望各位不吝赐教,感激不尽
fragment显示重叠,那就是多次添加导致的。
回到前台后,判断一下fragment的状态,如果为空。重新创建,add;已经添加过,直接show
提供你一个简单粗暴的解决方案,重写onSaveInstanceState,然后将保存的fragments置null。这样每次被系统回收就是正常的fragment加载创建过程,不需要考虑复用等一些复杂的逻辑。简单粗暴,至于原理,过两天会出一篇博客介绍这一部分,可以关注我哈
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
//直接将保存的`Fragment`置null
outState.putParcelable("android:support:fragments", null);
outState.putParcelable("android:fragments",null);
}
这个其实是涉及到生命周期的理解问题,你理解了生命周期回调函数的作用,你就会明白!
bundle只是一个传递参数的桶而已,你需要保存什么状态,通过bundle来传递即可!