1.问题描述
手机内存不足的时候,界面如果使用FragmentTransaction的hide、add方法添加fragment,出现界面重叠的现象(复现问题可以:打开“开发者选项”中的“不保留活动”-->进入应用-->按home键-->再次点击图标进入)
2.分析
- 在onActivityCreated(我的是Fragment嵌套Fragment;如果你的是Activity中嵌套Fragment,则是onCreate方法)中,通过打印发现Bundle类型的参数值不为null,这是因为Activity再被回收的时候系统会保存一些值;
- 其实真正产生重叠的原因在于系统Activity恢复的时候会把之前加载Fragment也重新加载到activity中去(这个Fragment没有相关引用,我们处理不了),但是我们调用FragmentTransaction的add方法的时候,又重新add了一个Fragment,也就是会出现同一个类型的Fragment会加载两遍的问题;
- 当你复现问题的时候,你会发现重新进入的界面和上一次进入的不是同一个;
3.分析
- 为每个Fragment的布局设置不透明的背景,这样呈现给用户的就只有一个界面;但是这样会有个问题,就是分析中的第三点,恢复的界面和上一次的界面不统一的问题;
- 保存activity被回收时,fragment的position位置:
private int position = 0;
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt("position", position);
}```
在onActivityCreated或者onCreate方法中通过Bundle的getInt方法得到上次的position;
3. 分析第二点提到了,主要是activity恢复的时候,系统将之前的fragment恢复了,那么如果我们可以得到之前fragment的引用,后面判断fragment是否为空的时候就不需要重新new一个Fragment了,这里主要是通过FragmentManager的findFragmentByTag得到之前的fragment:
``` java
Fragment = mFragmentManager.findFragmentByTag("TAG");
网友评论