Android从后堆栈中删除交易

时间:2018-10-16 01:16:15

标签: android android-fragments fragmenttransaction fragmentmanager fragment-backstack

我有3个片段,我正在使用底部菜单(3个项目)进行导航,可以说我是这样导航的:

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

当我按下“后退”按钮时,就会发生这种情况

A <-B <-C <- B <- C

我想要的是这个

A <- B <- C

这意味着如果必须删除已添加的旧片段,则更准确地说是从后堆栈中删除事务

此代码不起作用,因为我们在此处添加新交易:

FragmentTransaction transaction = mContext.beginTransaction();
Fragment lastFragment = mContext.findFragmentByTag(mFragmentTag);
if (lastFragment != null) {
     transaction.remove(lastFragment);
     transaction.commit();
}

顺便说一句,可能有些开发人员会犯一个错误,但是后堆栈存储了事务而不是片段。

1 个答案:

答案 0 :(得分:0)

要获得这种行为,您可以遵循以下步骤:

我假设您有一个onTabSelected(int position),每次您点击底部菜单时都会被调用。

public void onTabSelected(int position, boolean wasSelected) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    // Pop off everything up to and including the current tab 
    fragmentManager.popBackStack(SELECTED_FRAG_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE);

    // Add again the new tab fragment
    fragmentManager.beginTransaction()
            .replace(R.id.container, TabFragment.newInstance(),
                    String.valueOf(position)).addToBackStack(SELECTED_FRAG_TAG)).commit();
}

首先,您需要为所有片段添加标签。基本思想是popBackStack直到所选的片段标签。

根据popBackStack(String name, int flags)

的文档
  

从经理的片段中弹出最后一个片段过渡        后堆栈。如果没有要弹出的内容,则返回false。        此函数是异步的-它使        请求弹出,但是直到应用程序才会执行操作        返回其事件循环。

     

@param name如果不为空,则为先前返回状态的名称   寻找如果找到,则将弹出该状态之前的所有状态。

     

{@ link #POP_BACK_STACK_INCLUSIVE}标志可用于控制是否        命名状态本身会弹出。如果为null,则仅弹出最高状态。        @param标志为0或{@link #POP_BACK_STACK_INCLUSIVE}。