我有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();
}
顺便说一句,可能有些开发人员会犯一个错误,但是后堆栈存储了事务而不是片段。
答案 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}。