android - 垃圾收集破坏的 Activity 和后台堆栈中的所有 fragment 都显示而不是仅显示当前 Activity

标签 android android-fragments

所以我启用了设置以在您离开 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/

相关文章:

android - 以编程方式设置文本时,如何避免出现自动完成下拉菜单?

android - 在android中使用GPS确定车辆的速度

android - 不要剪辑 ViewPager 页面

android - 在Android中将电话号码格式化为E164格式

java - 动画横幅从左向右滑动(屏幕外到屏幕上)

Android Studio - 附加两个视频但显示黑屏

java - 是否可以像在 android 中一样为我的应用程序的 Activity 创建一个最近的屏幕

带有选项卡和 Viewpager 的 Android fragment

java - Android Studio - fragment 按钮 Action

java - 在 Android Fragment 中使用 Firebase 电话身份验证