【问题标题】:Android: How to remove fragments from backstack?Android:如何从后台删除片段?
【发布时间】:2014-06-09 11:08:03
【问题描述】:

我有一种情况,我想从 backstack 中清除所有片段,除了可见的片段(即在顶部)

比如backstack中有四个fragment A->B->C->D(D在顶)

现在我想从 backstack 中删除片段 A、B、C。但限制是在从 backstack 中删除历史记录时,片段 D 不应该有任何可见的影响。

这是我的代码。

FragmentManager fm = getActivity().getSupportFragmentManager();
                Bundle bundle = new Bundle();
                OrderReceiptFragment orderReceiptFragment = new OrderReceiptFragment();
                bundle.putSerializable("orderHistory", orderHistory);
                orderReceiptFragment.setArguments(bundle);
                CommonUtil.clearBackstack(fm);
                fm.beginTransaction().setCustomAnimations(R.anim.enter_from_left,
                        R.anim.exit_to_right)
                        .replace(R.id.container, orderReceiptFragment).commit();

清空栈的方法

public static void clearBackstack(FragmentManager fragmentManager) {    
    fragmentManager.popBackStack(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

这里的问题是 - 在清除后台堆栈时,后台堆栈中的第一个片段在几毫秒内可见。这看起来很奇怪。有人对此有任何解决方案吗?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    你可以这样做

    方法 1 :: 一个一个删除

     FragmentManager fm = getActivity().getSupportFragmentManager();
          for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
          fm.popBackStack();
    }
    

    方法二

     FragmentManager fm = getActivity().getSupportFragmentManager();
    fm .popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) 
    

    Refer

    看到这个Answer。你可以找到不同的方法

    另请参阅popBackStackImmediate

    【讨论】:

    • 你有没有试过不同的方法,这些是清除backstack的常用方法。首先你有没有尝试过
    【解决方案2】:

    这个怎么样-

    mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) 
    

    【讨论】:

      【解决方案3】:

      试试这个代码:

       FragmentManager _manager = getActivity().getSupportFragmentManager();
      _manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) 
      

      【讨论】:

      • 我知道这个方法,我目前正在使用它,但在启动片段 D 之前。但用户可以看到效果,即片段 A 在片段 D 开始之前可见一毫秒。而且看起来很奇怪。
      【解决方案4】:

      如果您试图让历史记录中的唯一布局是您当前正在查看的布局,您可以在清单中执行以下操作:

      android:noHistory="true"
      

      为每个您不想出现在历史记录中的片段/活动添加它。

      【讨论】:

        【解决方案5】:

        非常简单:

        FragmentManager frgManager;
        frgManager = getActivity().getSupportFragmentManager();
        frgManager.popBackStack("null", FragmentManager.POP_BACK_STACK_INCLUSIVE);
        

        【讨论】:

        • 为什么第一个参数是 '0' 而不是 'null' ?有什么具体原因吗?
        • 没有具体原因......它可以工作,但效果是可见的,正如我在我的问题中所写的......我的客户不喜欢......
        • 任何片段的“弹出”——无论你使用什么片段管理器——都会使它们在短时间内“复活”(他们喜欢以通常的方式返回,就好像用户通过 '返回键)。根本不回答问题
        猜你喜欢
        • 2015-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        相关资源
        最近更新 更多