使用后台堆栈的奇怪的android片段问题

时间:2013-03-12 14:32:50

标签: android android-fragments android-lifecycle

我有Android兼容包碎片的以下问题。 片段的层次结构如下:

A(登录) - > B(仪表板) - > C(详情)

登录片段添加了函数:

private void addFragment(Fragment f) {
    FragmentTransaction ft = mFragmentManager.beginTransaction();
    ft.replace(R.id.main_content, f);
    ft.commit();
}

成功登录后,仪表板以相同的方式添加,无需向Backstack添加事务。 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();

onActivityCreated(),也调用了B片段的onStart()(而不是用docs编写的onResume),使我的代码崩溃,因为在这个片段中我开始了一些线程操作,并且在添加登录片段后我得到了IllegalStateException,即片段B没有附加到活动(当线程操作结束时更新片段UI)有谁知道替换真正起作用以及如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

我想你应该打电话 addToBackStack为您添加的每个片段添加一个不同的名称。 在我看来,阅读你的代码你不会这样做。