gpt4 book ai didi

android - 如何将 android 导航堆栈弹出到某个 fragment ?

转载 作者:行者123 更新时间:2023-12-05 00:07:50 25 4
gpt4 key购买 nike

我再次请求您的智力支持。

我有一个 fragment ,它像这样将自己的多个副本放在导航后退堆栈上:

Navigation.findNavController(button).navigate(
TaskCollectFragmentDirections.actionTaskCollectFragmentSelf(args.taskIndex, args.screenIndex + 1)
)

上面的代码按预期工作。

问题来了,当我想从导航后台弹出指定数量的这些 fragment 时。 (由按下按钮触发。)

我试过这样做:

Navigation.findNavController(button).popBackStack(lastRecurringFragmentId, false)

我的代码可以编译和运行,但什么也不做。当我没有为 popBackStack 函数提供任何参数时,它会正确弹出最顶层的 fragment 。我还可以使用后退箭头一直导航回到起始 fragment 。

如果它有任何重要性,lastRecurringFragmentId 来自这个函数:

fun getLastRecurringFragmentId(recurringFragmentCount: Int): Int {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)!!
val backStackEntryCount = navHostFragment.childFragmentManager.backStackEntryCount
val indexOfRequested = backStackEntryCount - recurringFragmentCount
val requestedEntry = navHostFragment.childFragmentManager.getBackStackEntryAt(indexOfRequested)
return requestedEntry.id
}

导航图如下。应该有几个 TaskCollectFragment,最后一个 TaskEndFragment 在后台堆栈的顶部。当用户按下 TaskEndFragment 上的按钮时,我想从堆栈中弹出一些 TaskCollectFragment:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
app:startDestination="@id/nav_home">

<fragment
android:id="@+id/nav_home"
android:name="ui.home.HomeFragment"
android:label="@string/menu_home"
tools:layout="@layout/fragment_home" >
<action
android:id="@+id/action_nav_home_to_taskCollectFragment"
app:destination="@id/taskCollectFragment" />
</fragment>

<fragment
android:id="@+id/taskCollectFragment"
android:label="TaskCollectFragment"
tools:layout="@layout/task_collect_fragment"
>
<action
android:id="@+id/action_taskCollectFragment_to_taskEndFragment"
app:destination="@id/taskEndFragment" />
<action
android:id="@+id/action_taskCollectFragment_self"
app:destination="@id/taskCollectFragment" />
<argument
android:name="taskIndex"
app:argType="integer" />
<argument
android:name="screenIndex"
app:argType="integer" />
</fragment>
<fragment
android:id="@+id/taskEndFragment"
android:name="ui.task.TaskEndFragment"
android:label="TaskEndFragment"
tools:layout="@layout/task_end_fragment">
<argument
android:name="taskIndex"
app:argType="integer" />
</fragment>
</navigation>

有没有一种方法可以在满足特定条件之前将 fragment 从后台堆栈中弹出?

最佳答案

我创建了两个几乎相同的 fragment ,forSessionTaskCollectFragmentrecurringTaskCollectFragment 具有相同的 viewModel。它们看起来一样,从用户的角度来看,它们做的也一样。forSessionTaskCollectFragment 是我想保留的,recurringTaskCollectFragment 是我想稍后弹出的。

从主页 fragment ,我的导航图转到 forSessionTaskCollectFragment,从那里它循环回到自身或转到 recurringTaskCollectFragment,后者也循环回到自身或最终转到 TaskEndFragment

<fragment
android:id="@+id/nav_home"
android:name="ui.home.HomeFragment"
android:label="@string/menu_home"
tools:layout="@layout/fragment_home" >
<action
android:id="@+id/action_nav_home_to_orSessionTaskCollectFragment"
app:destination="@id/forSessionTaskCollectFragment" />
</fragment>

<fragment
android:id="@+id/forSessionTaskCollectFragment"
android:name="ui.task.ForSessionTaskCollectFragment"
android:label="ForSessionTaskCollectFragment" >
<action
android:id="@+id/action_forSessionTaskCollectFragment_self"
app:destination="@id/forSessionTaskCollectFragment" />
<action
android:id="@+id/action_forSessionTaskCollectFragment_to_recurringTaskCollectFragment"
app:destination="@id/recurringTaskCollectFragment" />
<argument
android:name="taskIndex"
app:argType="integer" />
<argument
android:name="screenIndex"
app:argType="integer" />
</fragment>

<fragment
android:id="@+id/recurringTaskCollectFragment"
android:name="ui.task.RecurringTaskCollectFragment"
android:label="TaskCollectFragment"
tools:layout="@layout/recurring_task_collect_fragment"
>
<action
android:id="@+id/action_recurringTaskCollectFragment_to_taskEndFragment"
app:destination="@id/taskEndFragment" />
<action
android:id="@+id/action_recurringTaskCollectFragment_self"
app:destination="@id/recurringTaskCollectFragment" />
<argument
android:name="taskIndex"
app:argType="integer" />
<argument
android:name="screenIndex"
app:argType="integer" />
</fragment>

我将 forSessionTaskCollectFragment 放在堆栈上,直到到达我想要返回的点。

Navigation.findNavController(button).navigate(
if(args.screenIndex < viewModel.forSessionScreenCount) {
ForSessionTaskCollectFragmentDirections.actionForSessionTaskCollectFragmentSelf(args.taskIndex, args.screenIndex + 1)
} else {
ForSessionTaskCollectFragmentDirections.actionForSessionTaskCollectFragmentToRecurringTaskCollectFragment(args.taskIndex, args.screenIndex + 1)
}
)

之后我把我稍后想要弹出的 fragment 放回去,最后从我想要弹出我需要的 fragment 的地方转到TaskEndFragment:

Navigation.findNavController(button).navigate(
if(args.screenIndex < viewModel.screenCount - 2) {
RecurringTaskCollectFragmentDirections.actionRecurringTaskCollectFragmentSelf(args.taskIndex, args.screenIndex + 1)
} else {
RecurringTaskCollectFragmentDirections.actionRecurringTaskCollectFragmentToTaskEndFragment(args.taskIndex)
}
)

因此,在 TaskEndFragment 的按钮按下时,我可以弹出回到堆栈上我标记为从“ session ” fragment 更改为“重复” fragment 的确切位置:

Navigation.findNavController(button).popBackStack(R.id.forSessionTaskCollectFragment, false)

这很麻烦,我没有找到任何我想做的事的例子,但最终还是想出了一个可行的解决方案。 Ianhanniballake 再次感谢,你触发了我的想法。

关于android - 如何将 android 导航堆栈弹出到某个 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66172279/

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