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从后台堆栈中删除事务的主要内容,如果未能解决你的问题,请参考以下文章