【发布时间】:2020-01-18 11:02:10
【问题描述】:
短版:
我通过replace方法(A -> B -> C -> D -> E)将5个片段全部添加到容器中,现在我想从我的backStack(C)中删除3rdfragment并留在当前页面,怎么做?
问题:
我有 3 个片段,FragmentA、FragmentB 和 FragmentC,用户从 A to B then C 导航。
在 FragmentC 中,当用户执行操作时(我称之为 ActionX)我需要从我的片段管理器 BackStack 中删除 FragmentB(而用户仍在 FragmentC 中)并且我不希望用户注意到任何事情,就在他在手机上按下不同的片段显示(所以如果用户按下片段A显示时发生ActionX,如果不是片段B显示)
这就是我显示我的fragments 的方式(我为名称和标签设置片段名称,以便在需要时找到它们)
public void showFragment(Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
String tag = fragment.getClass().getSimpleName();
fragmentTransaction.replace(R.id.fragment_container, fragment, tag);
fragmentTransaction.addToBackStack(tag);
fragmentTransaction.commit();
}
我尝试了一些 SO 线程中提到的解决方案(例如 this),但它们仅适用于堆栈中的顶部片段,或者他们建议不使用 FragmentB(我不能这样做,因为我不知道用户会做什么),还发现并且从堆栈中删除 FragmentB 不起作用。 一种解决方案是覆盖我的 Activity 的 onBackPressed 并检查 ActionX 是否发生并弹出我的 backStack 两次。
我尝试了什么:
- 这不起作用(fragmentBInStack 不为空,但当我删除它时没有任何反应)
val fragmentBInStack = manager.findFragmentByTag(FragmentB::class.java.simpleName)
fragmentBInStack?.let {
manager.beginTransaction().remove(it).commit()
}
- 如果我使用
POP_BACK_STACK_INCLUSIVE的用户0 instad,此代码将同时删除FragmentC 和FragmentB 并显示FragmentA(我想留在FragmentC),它只会弹出FragmentC 并显示FragmentB
manager.popBackStack(FragmentB::class.java.simpleName, FragmentManager.POP_BACK_STACK_INCLUSIVE)
这是我想做的一些示例代码
class FragmentC : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<View>(R.id.action_x).setOnClickListener {
//here I want to remove FragmentB from back Stack and stay in FragmentC, just later when user presses back I want to show FragmentA
val manager = activity!!.supportFragmentManager
val fragmentBInStack = manager.findFragmentByTag(FragmentB::class.java.simpleName)
fragmentBInStack?.let {
manager.beginTransaction().remove(it).commit()
}
}
}
【问题讨论】:
标签: java android android-fragments kotlin fragment-backstack