所以我启用了设置以在您离开 Activity 时销毁 Activity 设置=>开发者选项=>不保留 Activity
这基本上应该复制一个被垃圾收集的 Activity 或 fragment ,然后我必须通过 bundle savedinstancestate 恢复数据。
所以我明白它是如何工作的。但似乎当我从 fragment 1 导航到 fragment 2,然后将应用程序置于后台,然后置于前台(破坏 Activity ) fragment 1 和 fragment 2 同时显示。其中应该只显示 fragment 2。
我不知道这是否是我必须管理在保存实例上隐藏和显示 fragment 的标准。或者如果我的代码中的某些东西正在破坏东西。下面是我推送 fragment 的方法,希望对你有帮助:
public void pushFragmentWithAnimation(FragmentManager fm, int parentId, Fragment currentFrag, Fragment newFrag, int animEntry, int animExit) {
hideSoftKeyboard(currentFrag.getActivity());
FragmentTransaction ft = fm.beginTransaction();
// See: http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int)
ft.setCustomAnimations(animEntry, animExit, animEntry, animExit);
ft.add(parentId, newFrag, String.format("Entry%d", fm.getBackStackEntryCount())).hide(currentFrag).show(newFrag);
ft.addToBackStack(null);
ft.commit();
}
fragment 1 仍在后台堆栈中,因为当我按回键时,我只看到 fragment 1。如果您知道为什么会这样,请告诉我。
最佳答案
XML 添加的 fragment 和以编程方式添加的 fragment 的生命周期差异很大,因此混合它们不是一个好主意,如详细解释 here .
解决这个问题的最简单方法是通过用具有相同 ID 的 FrameLayout 替换 XML 扩展的 Fragment,然后在 onCreate 添加中以编程方式添加所有 fragment
FragmentManager fragMgr = getSupportFragmentManager();
if (null == fragMgr.findFragmentByTag(FRAG_TAG))
{
fragMgr.beginTransaction().
add(R.id.fragment, new Fragment1(), FRAG_TAG).commit();
}
其中 FRAG_TAG
是任何唯一的字符串。这确保 Fragment1 仅在布局中不存在时才创建。
关于android - 垃圾收集破坏的 Activity 和后台堆栈中的所有 fragment 都显示而不是仅显示当前 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15305284/