我的应用程序如下:
第一个屏幕:登录页面(片段)。用户登录后,将其替换为下一个屏幕。
其他屏幕:在应用内,用户可以看到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);
}
}
现在无论我何时何地尝试退出,它都能正常运作。
答案 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();
玩得开心!