【问题标题】:Clear fragment backstack without invoking onCreateView of popped fragments在不调用弹出片段的 onCreateView 的情况下清除片段回栈
【发布时间】:2016-12-16 03:51:17
【问题描述】:

我的应用有 3 个 UI 级别,每个级别都有自己的片段,A -> B -> C。 我希望可选地允许我的应用用户直接导航到顶级片段,即从 C -> A 而不调用 B。 即,如果用户按下后退按钮,我仍然希望允许用户从 C->B 转到,但是在 C 片段中,我有一个“主页”按钮,可以将他们直接带到 A。这就是我的操作想要刷新后台堆栈。 此外,我希望用户能够使用后退按钮从 B->A 进入,因此我将 A 和 B 都添加到 backstack 中。

我已经尝试了this SO post 中的选项,但在每种情况下,都会为每个片段调用 onCreateView,即使我使用 fm_.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

也查了这个帖子,好像推荐使用popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)

任何人都可以建议一种方法来弹出整个后台堆栈,而无需在弹出的片段上调用 ​​onCreateView 吗?

【问题讨论】:

    标签: android android-fragments fragment-backstack


    【解决方案1】:

    不要为从片段 B->C 开始添加 backStack 行

    从 A->B 出发时使用

    HighlightFragment highlightFragment=new HighlightFragment(FirstReaderScreen.this);
        getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.LL_Fragment, highlightFragment) // LL_Fragment is container
        .addToBackStack(null)
        .commit();
    

    在进行 B->C 时使用

      HighlightFragment highlightFragment=new HighlightFragment(FirstReaderScreen.this);
            getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.LL_Fragment, highlightFragment)
            .commit();
    

    不要添加行 .addtobackstack(null)

    这对我有用

    【讨论】:

    • 很抱歉,我的帖子没有完整记录工作流程。我已经更新它来解释完整的导航。我不能跳过从后台添加 A 或 B。
    • 我已经在处理后退按钮按下,如上所述,我的问题是来自 C -> A 的“Go to Home”导航,我想在不调用 B 上的 onCreateView 的情况下刷新 backstack .
    • 我有一个想法,当你想直接打开 A 而不是打开 B 时,在 C 中创建一个新的 A 片段并转到片段 A 并清除所有返回堆栈片段,否则如果你想去 B 只做 popupbackstack,也许它会工作
    • 问题是,我如何“清除所有的 backstack 碎片”?如果我尝试原始帖子中提到的“推荐”方法,它们中的每一个都会在后台堆栈中的每个片段上调用 ​​onCreateView。我不想那样。
    【解决方案2】:

    我估计您正在使用替换片段。 如果您不想弹回,请尝试使用 begintransaction.hide / show 来管理 1 个活动中的许多片段

    //on Activity
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(containerId, new FragmentA(), fragmentA.getClass().getSimpleName());
    fragmentTransaction.commit();
    //inside fragment A to jump fragment without PopBackStack
    getFragmentManager().beginTransaction().hide(this).commit();
    getFragmentManager().beginTransaction().show(new FragmentB()).commit();
    

    【讨论】:

    • 对不起,我的帖子没有完整记录导航,我已经更新了。到目前为止,我发现的唯一解决方法是完全从后台跳过 A,然后将代码添加到 B 和 C 中,以便在用户单击 B/C 中的“Go to Home”或按下时专门用 A 替换 B / C B 的 android 后退按钮。但这是一个 hack,我更喜欢一种更干净的方式来刷新 backstack,而不在 B 或 A 上调用 onCreateView。
    【解决方案3】:

    当我需要清除 BottomNavigationView 中选项卡开关的后台堆栈时,这对我有用

    public void clearBackStack() {
    
        int backStackEntryCount = mFragmentActivity
                                        .getSupportFragmentManager()
                                        .getBackStackEntryCount();
    
        for (int i = 0; i < backStackEntryCount; i++) {
            mFragmentActivity.getSupportFragmentManager().popBackStack();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多