Android - 片段返回堆栈导致白屏
Android - fragment back stack resulting into white screen
我的项目中有五个不同的片段,我们称它们为 A...E。 A 和 B 只有在用户打开应用程序时才可见。这些负责显示加载屏幕(检查当前登录会话)和登录屏幕本身。片段 C 是该应用程序的主屏幕,用户可以使用它来访问应用程序的其他区域。因此,片段 D 和 E 在交易 created/commited.
时得到了额外的 "addToBackStack(String)"
导致黑屏的问题是当用户打开 D 或 E 并再次返回 C 时。此操作可能导致第一次 C 的空白屏幕或多次重做该步骤。
相关片段 C、D、E 正在使用视图持有者、数据绑定和回收器视图。每个回收器视图都有多种视图类型。
C 的 onBackPressed 似乎正确执行,但 C 已从缓存或类似的东西中删除。
希望有人能帮我解决这个问题。
我找到了可能解决我的问题的方法。仍然需要进一步测试,但到目前为止它似乎有效:
private void showFragment(Fragment fragment, String tag, String backStackTag) {
FragmentTransaction ft = fragmentManager.beginTransaction();
if (backStackTag != null) {
ft.addToBackStack(backStackTag);
}
switch (tag) {
case "A":
case "B":
ft.replace(containerId, fragment, tag);
break;
case "C": {
Fragment main = fragmentManager.findFragmentByTag("C");
if (main != null) {
ft.show(main);
} else {
ft.replace(containerId, fragment, tag);
}
break;
}
case "D":
case "E": {
Fragment main = fragmentManager.findFragmentByTag("C");
ft.hide(main);
ft.add(containerId, fragment, tag);
break;
}
default:
ft.add(containerId, fragment, tag);
break;
}
ft.commit();
}
我的项目中有五个不同的片段,我们称它们为 A...E。 A 和 B 只有在用户打开应用程序时才可见。这些负责显示加载屏幕(检查当前登录会话)和登录屏幕本身。片段 C 是该应用程序的主屏幕,用户可以使用它来访问应用程序的其他区域。因此,片段 D 和 E 在交易 created/commited.
时得到了额外的 "addToBackStack(String)"导致黑屏的问题是当用户打开 D 或 E 并再次返回 C 时。此操作可能导致第一次 C 的空白屏幕或多次重做该步骤。
相关片段 C、D、E 正在使用视图持有者、数据绑定和回收器视图。每个回收器视图都有多种视图类型。
C 的 onBackPressed 似乎正确执行,但 C 已从缓存或类似的东西中删除。
希望有人能帮我解决这个问题。
我找到了可能解决我的问题的方法。仍然需要进一步测试,但到目前为止它似乎有效:
private void showFragment(Fragment fragment, String tag, String backStackTag) {
FragmentTransaction ft = fragmentManager.beginTransaction();
if (backStackTag != null) {
ft.addToBackStack(backStackTag);
}
switch (tag) {
case "A":
case "B":
ft.replace(containerId, fragment, tag);
break;
case "C": {
Fragment main = fragmentManager.findFragmentByTag("C");
if (main != null) {
ft.show(main);
} else {
ft.replace(containerId, fragment, tag);
}
break;
}
case "D":
case "E": {
Fragment main = fragmentManager.findFragmentByTag("C");
ft.hide(main);
ft.add(containerId, fragment, tag);
break;
}
default:
ft.add(containerId, fragment, tag);
break;
}
ft.commit();
}