我对 Android 兼容性包片段有以下问题。片段的层次结构如下:
A(登录)-> B(仪表板)-> C(详细信息)
登录片段添加了功能:
private void addFragment(Fragment f) {
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.replace(R.id.main_content, f);
ft.commit();
}
成功登录后,仪表板以相同的方式添加,无需将事务添加到后台堆栈。C片段添加如下:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.main_content, f, id);
ft.addToBackStack(null);
ft.commit();
所以基本上在详细信息屏幕上我有注销按钮,它应该让我登录 A 并从 backstack 中删除所有片段。根据android开发者文档:
然而,如果您在删除片段时确实调用了 addToBackStack(),那么片段将停止,并且如果用户导航回来,它将恢复。
但这不是我的问题。在 C 片段中按下注销时:
getFragmentManager.popBackStackImmediate();
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.replace(R.id.main_content, new LoginFragment());
ft.commit();
B片段的onActivityCreated(),onStart()也被调用(而不是文档中编写的onResume),使我的代码崩溃,因为在这个片段中我开始了一些线程操作,并且在添加登录片段后我得到了IllegalStateException片段B没有附加到一个活动(当线程操作结束时,它会更新片段 UI)有谁知道替换是如何真正起作用的以及如何克服这个问题?