Android从后台堆栈中删除事务

Posted

技术标签:

【中文标题】Android从后台堆栈中删除事务【英文标题】:Android remove transaction from back stack 【发布时间】:2019-03-20 11:12:23 【问题描述】:

我有 3 个片段,我正在使用底部菜单(3 个项目)导航,假设我这样导航:

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

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

A B C

而我想要的是这个

A B C

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

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

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

顺便说一句,可能有些开发者会犯错,但是后台堆栈存储的是事务而不是片段。

【问题讨论】:

【参考方案1】:

要获得这种行为,您可以遵循以下内容:

我假设您有一个 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。

【讨论】:

谢谢你的回复,如果我有这种情况:A -> B -> C -> B,如果我点击后退按钮,我想要这个:A

以上是关于Android从后台堆栈中删除事务的主要内容,如果未能解决你的问题,请参考以下文章

Android:从后台堆栈中删除所有以前的活动

Android:OutOfMemory 错误和后台堆栈

当一个活动直接从一个通知启动时,你如何构建一个 Android 后台堆栈?

Android - 从堆栈中间删除特定片段不起作用

Android GCM 通知后台堆栈

Android Reorder Fragment Backstack