gpt4 book ai didi

java - 从 backstack 中删除不在 backstack 顶部的特定 fragment

转载 作者:行者123 更新时间:2023-12-01 18:47:36 25 4
gpt4 key购买 nike

简短版本:

我有 5 个 fragment ,均由 replace 添加到容器中方法(A -> B -> C -> D -> E),现在我想从我的backStack(C)中删除第3个 fragment 并保留在当前页面,该怎么做?

问题:

我有 3 个 fragment ,FragmentA , FragmentB ,和FragmentC ,用户从 A to B then C 导航。在 FragmentC 中,当用户执行操作(我称之为 ActionX )时,我需要删除 FragmentB来 self 的 fragment 管理器 BackStack (当用户仍然在 FragmentC 中时)并且我不希望用户注意到任何事情,就在他按下手机时,不同的 fragment 显示(因此,如果 ActionX 发生在用户按下 fragment A 时,则显示,如果不是 FragmentB 显示)

这就是我展示我的 fragments 的方式(我为名称和标签设置了 fragment 名称,以便在需要时找到它们)

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 ),但它们只适用于堆栈中的顶部 fragment ,或者他们建议不要使用 FragmentB (我不能,因为我不知道用户会做什么),也发现并且从堆栈中删除 FragmentB 不起作用。一种解决方案是覆盖我的 Activity 的 onBackPressed 并检查 ActionX 是否发生并弹出我的 backStack 两次。

我尝试过:

  1. 这不起作用(fragmentBInStack 不为​​空,但当我删除它时什么也没有发生)
val fragmentBInStack = manager.findFragmentByTag(FragmentB::class.java.simpleName)
fragmentBInStack?.let {
manager.beginTransaction().remove(it).commit()
}
  • 如果我使用 0 而不是 POP_BACK_STACK_INCLUSIVE,此代码会删除 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()
    }
    }
    }

    最佳答案

    好的,首先,您必须在单独的事务中添加 fragment ,并将 replace 更改为 add

    supportFragmentManager
    .beginTransaction()
    .add(R.id.fragment_container, fragment2, tag2)
    .addToBackStack(tag2)
    .commit()

    然后你就可以像这样删除 fragment :

    val fragment2 = supportFragmentManager.findFragmentByTag(tag2)!!
    supportFragmentManager.beginTransaction().remove(fragment2).commit()

    最后一步只是 popBackStack:

    supportFragmentManager.popBackStack()

    关于java - 从 backstack 中删除不在 backstack 顶部的特定 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59799928/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com