有没有一种很好的方法来删除/添加/隐藏/显示活动中的一组片段?

时间:2015-04-27 19:37:21

标签: android android-fragments back-stack

我的应用程序如下:

  • 第一个屏幕:登录页面(片段)。用户登录后,将其替换为下一个屏幕。

  • 其他屏幕:在应用内,用户可以看到5个不同的片段,包括地图,它们都是相关的。

我在退出功能方面遇到了问题。我想,无论用户在应用程序中的哪个位置,都会在用户注销时删除所有可能的片段。问题是我的地图可能被隐藏而不是删除。

我尝试实施:viewDidLoad 但它有缺陷和间歇性。有时候它有效,有时我的LoginFragment会出现fragmentManager.popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);异常。

有没有办法安全地删除/停止/销毁一整套碎片? 如果在这种情况下有更好的做法,请告诉我。

谢谢!

修改 我用这个(更安全的?)方法来清理我的靠背堆:

java.lang.IllegalStateException: Fragment already added

我最终做的是分离我的所有碎片,以便他们停止。但是,我在Fragment创建时初始化了资源(音频),甚至分离它们仍然会运行(播放音频)。然后我想出了这个方法,以确保我释放了所有资源,并用我的所有片段运行它:

private void clearBackStack() {
    FragmentManager manager = getFragmentManager();
    if (manager.getBackStackEntryCount() > 0) {
        FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
         manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}

现在无论我何时何地尝试退出,它都能正常运作。

1 个答案:

答案 0 :(得分:0)

您可以在将片段添加到活动之前对其进行标记,如下所示:

FooFragment fragment = new FooFragment(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container, fragment, "foo");
transaction.addToBackStack("foo");
transaction.commit();

这样,当您使用片段管理器找到片段时,您可以做很多事情:

currentFragment = getFragmentManager().findFragmentByTag("foo");
if (currentFragment != null) {
    //This means your fragment has been added to your backstack before
    if (currentFragment.isVisible ()) {
          // Is currently visible to the user
          if (currentFragment.isResumed())
              // Is resumed... etc...
    }
}

我通常使用“立即”方法从后台弹出,只是因为我正在标记片段并且始终知道当前可用的片段:

getFragmentManager().popBackStackImmediate();

玩得开心!