簡體   English   中英

如何將 android 導航 backstack 彈出到某個片段?

[英]How do I pop android navigation backstack up to a certain fragment?

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

我有一個片段,它把自己的許多副本放在導航 backstack 上,如下所示:

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

上面的代碼按預期工作。

當我想從導航堆棧中彈出指定數量的這些片段時,問題就來了。 (由按下按鈕觸發。)

我試過這樣做:

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

我的代碼編譯並運行,但什么也不做。 當我沒有為popBackStack function 提供任何參數時,它會正確彈出最頂部的片段。 我還可以使用后退箭頭一直導航到起始片段。

如果它很重要, lastRecurringFragmentId來自這個 function:

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 s,最后一個TaskEndFragment在 backstack 的頂部。 當用戶按下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>

有沒有辦法可以在滿足特定條件之前從后台彈出碎片?

我創建了兩個幾乎相同的片段, forSessionTaskCollectFragmentrecurringTaskCollectFragment具有相同的視圖模型。 它們看起來是一樣的,從用戶的角度來看它們也是一樣的。 forSessionTaskCollectFragment是我想要保留的,而recurringTaskCollectFragment是我以后想要彈出的。

從主片段,我的導航圖轉到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)
    }
)

之后,我將稍后要彈出的片段,最后將 go 放到我想要彈出片段的TaskEndFragment中:

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

因此,在TaskEndFragment的按鈕按下時,我可以彈回后台堆棧上我標記為從“會話”片段更改為“重復”片段的確切位置:

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

這很麻煩,我沒有找到任何我想做的事情的例子,但最終設法想出了一個可行的解決方案。 Ianhanniballake 再次感謝,你激發了我的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM