当前位置: 首页 > 知识库问答 >
问题:

碎片管理器。从管理器中删除片段时,GetBackbackEntryCount()不会减少

田翰林
2023-03-14

我想要的正确行为是:

Fragment A -> Fragment B -> Fragment C -> Fragment A

我目前的工作:

  1. 当我想从B回到A时,我使用了popBackStack(),但在这里一切都很顺利

我真的需要backbackbackentrycount与管理器中包含的片段相同。

有人知道我做错了什么吗?

我的代码:

        Fragment fragment1 = fragmentManager.findFragmentByTag("NavigationFragment_");
    if (fragment1 != null) {
        fragmentManager.beginTransaction()
                .setTransition(TRANSIT_FRAGMENT_FADE)
                .remove(fragment1)
                .commit();

    }

    fragmentManager.beginTransaction()
            .addToBackStack(backstack)
            .setTransition(TRANSIT_FRAGMENT_OPEN)
            //.remove(getFragmentManager().findFragmentByTag(NavigationFragment_.class.getSimpleName()))
            .add(R.id.fragmentContainer, fragment, fragment.getClass().getSimpleName())
            .commit();

我已经搜索了一段时间没有结果的解决方案,所以请不要将此标记为重复。

提前感谢。

共有2个答案

徐学潞
2023-03-14

FragmentManager的后栈仅在两种情况下更新:

  1. 您可以使用addToBackStack()

没有其他操作会影响后台堆栈-没有addToBackStack()的其他碎片事务只会更改当前状态,不会影响调用popBackStack()等时发生的情况。

如果希望堆栈从A转到A-

fragmentManager.beginTransaction()
    .replace(R.id.fragmentContainer, fragmentB)
    .addToBackStack("b")
    .commit();

然后,您希望您的后栈为A-

// First pop B
fragmentManager.popBackStack("b", FragmentManager.POP_BACK_STACK_INCLUSIVE)
// Then addToBackStack C
fragmentManager.beginTransaction()
    .replace(R.id.fragmentContainer, fragmentC)
    .addToBackStack("c")
    .commit();

这将确保在将FragmentC添加到后面的堆栈之前,从堆栈中删除FragmentB

类似地,如果要删除FragmentC并返回FragmentA,只需从后堆栈中弹出它:

// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)

注意:在同一个FragmentManager中混合回栈FragmentTransaction和常规FragmentTransaction从来都不是一个好主意,因为popBackStack()没有考虑到FragmentManager的当前状态,而是盲目地反转上的FragmentTransaction返回堆栈(即,最后的FragmentTransaction withaddToBackStack()

刘令
2023-03-14

如果您来到这里是因为调用了popBackStack(),但getBackStackEntryCount()似乎没有更新,那么您可能需要尝试popBackStackImmediate()。

popBackStack()是异步的——它将请求排入pop队列,但在应用程序返回其事件循环之前,不会执行该操作。

 类似资料:
  • 一、简介 碎片是什么?把一个完整的页面理解成由许多块组成,而每一个“块”我们就可认为就是一个”碎片“! 这样,我们在页面放置一些碎片,在以后的维护维护中,只需要对碎片进行维护! 碎片功能支持完全手动更新,并且可以搜索内容,可恢复数据至任何历史版本,常用于专题制作和首页频繁更新的内容。 您可以在模板中直接插入 {pc:block pos="index_block_1"}{/pc} 格式的碎片标签,然

  • 我想在收到一些HTTP请求的响应后,更新几个<code>片段 。-- 活动 适配器 碎片样本 日志显示位置0,1处的片段的<code>updateData</code>工作良好。但是对于位置2处的片段,它会导致错误。 我发现的区别是适配器没有为位置2调用,这意味着没有调用的。因此不存在。 我的直觉告诉我,问题一定来自适配器的工作流或fragmentManager事务。但是作为一个Android初学

  • 有没有办法,在不调用存储片段中的onCreateView()的情况下清除support FragmentManager的backbackback? 我理解片段lyfe循环,并在弹出时调用onDestroyView()和onCreateView()。http://developer.android.com/guide/components/fragments.html#Creating 我还知道如何

  • 我有一个用于交换片段的框架布局。我使用导航抽屉,每个菜单项都会打开一个片段。所以可以肯定的是,在所有应用程序周期中,屏幕上同时只有一个片段(因此只有一个活动)。下面您可以找到我的片段开始方法 所以当我在androidstudio上检查时,每次我用上述方法替换fragment时,内存使用量都会增加<代码>碎片事务。删除不会释放碎片,而替换也不会释放碎片。所以,过了一段时间,如果我点击每一个菜单项,一

  • 我有一个关于片段管理的问题。 我已经编写了一个基于碎片的抽屉活动。每次点击菜单项后,您都会看到一个空片段。 我如何实现这一点?

  • 我的照片应用程序里有一个片段。当用户编辑照片时, null 我的片段异步任务: 我在调用getParentFragmentManager()时遇到异常。我提到了一个相关的帖子,Fragment MyFragment not attached to Activity,但它与Fragment not be Activity相关。所以我不确定添加是否可以解决我的问题。理想情况下,在尝试弹出backSta