您的位置:首页 > 其它

Fragment重叠,使用show和hide控制显示和隐藏界面重叠问题;

2018-03-27 15:37 477 查看

Fragment重叠原因:

  App因某种原因崩溃自动重启,或App长期在后台运行Fragment依赖的activity被回收等等原因;当系统内存不足,Fragment 的依附Activity 被回收的时,Fragment 的实例并没有随之被回收。Activity被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层,当Activity通过再次被重建时,之前被实例化过的 Fragment 会出现在Activity中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了,所以就出现了重叠;

复现BUG:

设置 -- 开发者选项 -- 不保留活动(打开);这样设置后按HOME键Activity就会被回收。

方式一:(不推荐使用)

Activity被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层;简单粗暴:不让它保存; @Override
protected void onSaveInstanceState(Bundle outState) {
//不保存之前的fragment的状态
// super.onSaveInstanceState(outState);
}

方式二:(推荐使用)

重写onAttachFragment,重新让新的Fragment指向了原本未被销毁的fragment;@Override
public 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联动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: