Fragment重叠,使用show和hide控制显示和隐藏界面重叠问题;
2018-03-27 15:37
501 查看
Fragment重叠原因:
App因某种原因崩溃自动重启,或App长期在后台运行Fragment依赖的activity被回收等等原因;当系统内存不足,Fragment 的依附Activity 被回收的时,Fragment 的实例并没有随之被回收。Activity被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层,当Activity通过再次被重建时,之前被实例化过的 Fragment 会出现在Activity中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了,所以就出现了重叠;复现BUG:
设置 -- 开发者选项 -- 不保留活动(打开);这样设置后按HOME键Activity就会被回收。方式一:(不推荐使用)
Activity被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层;简单粗暴:不让它保存; @Overrideprotected void onSaveInstanceState(Bundle outState) {
//不保存之前的fragment的状态
// super.onSaveInstanceState(outState);
}
方式二:(推荐使用)
重写onAttachFragment,重新让新的Fragment指向了原本未被销毁的fragment;@Overridepublic void onAttachFragment(Fragment fragment) {
//重新让新的Fragment指向了原本未被销毁的fragment,它就是onAttach方法对应的Fragment对象
if (HomeFm == null && fragment instanceof Fragment1)
HomeFm = fragment;
if (SpcFm == null && fragment instanceof Fragment2)
SpcFm = fragment;
if (OrderFm == null && fragment instanceof Fragment3)
OrderFm = fragment;
if (MyFm == null && fragment instanceof Fragment4)
MyFm = fragment;
super.onAttachFragment(fragment);
}
方式三:(推荐使用)
在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉; */protected void onSaveInstanceState(Bundle outState) {
//在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉。
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.remove(HomeFm);
transaction.remove(SpcFm);
transaction.remove(OrderFm);
transaction.remove(MyFm);
transaction.commitAllowingStateLoss();
super.onSaveInstanceState(outState);
}
方式四:
Fragment保存自己是否显示;public class BaseFragment extends Fragment {
/**
* FragmentState没帮我们保存Hidden状态,那就我们自己来保存,在页面重启后,我们自己来决定Fragment是否显示!
*/
private static final String STATE_SAVE_IS_HIDDEN = "CCB_IS_HIDDEN";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (isSupportHidden) {
ft.hide(this);
} else {
ft.show(this);
}
ft.commit();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());
}
}
随意门:Fragment+Radiogroup联动
相关文章推荐
- 解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题
- 解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题
- 多个Fragment使用show和hide来切换时的画面重叠的问题
- Android 使用hide()和show()方法切换Fragment时的问题
- Android fragment 重叠问题——通过hide,show方式导致的解决方法
- Jquery中使用show()与hide()方法动画显示和隐藏图片
- Jquery中使用show()与hide()方法动画显示和隐藏图片
- Android fragment 重叠问题——通过hide,show方式导致的解决方法
- show hide 显示隐藏切换Fragment
- fragment重叠问题(add hide show方式)
- 隐藏显示控制(is/hide/show)
- [转]Android fragment 重叠问题——通过hide,show方式导致的解决方法
- Android fragment 重叠问题——通过hide,show方式导致的解决方法
- 通过hide,show方式导致的fragment 重叠问题
- 关于Activity加载Fragment切换Show和Hide重叠问题
- Android Fragment 切换多个界面 重叠问题 隐藏问题
- Android Fragment中使用hide/show出现页面重叠、穿透现象
- Android fragment 重叠问题——通过hide,show方式导致的解决方法
- [JQ权威指南]第十八天:使用show()与hide()方法动画显示和隐藏图片
- Android Fragment使用hide和show方法的问题