Как я могу go вернуться непосредственно к Фрагменту А после Фрагмента D, не возвращаясь к Фрагменту C? - PullRequest
2 голосов
/ 17 апреля 2020

Я использую Android Компонент архитектуры навигации.

У меня есть три Фрагмента A, B и C

  • Фрагмент A -> Фрагмент B -> Фрагмент D
  • Фрагмент A -> Фрагмент C -> Фрагмент D

На фрагменте D у меня есть кнопка, используемая для подтверждения изменений и завершения sh. Из этого Фрагмента DI хотел бы:

  1. вернуться к Фрагменту B, когда я приду из Фрагмента B (я использую findNavController().navigateUp())
  2. вернуться к Фрагменту A, когда я приду из Фрагмента C (я не знаю, как это сделать)

Как я могу go вернуться прямо к Фрагменту A, когда я возвращаюсь из Фрагмента D, не возвращаясь к Фрагменту C?

Стоит ли ждать возврата по фрагменту C и повторной обработки для выполнения findNavController().NavigateUp().

Ответы [ 3 ]

1 голос
/ 19 апреля 2020

Вы можете выполнить оба этих действия с помощью findNavController().NavigateUp()

Например, на следующем графике: graph

   <?xml version="1.0" encoding="utf-8"?>
   <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/test_nav_graph"
        app:startDestination="@id/a">

        <fragment
            android:id="@+id/a"
            android:name="fragment.A"
            tools:layout="@layout/a_fragment"
            android:label="A" >
            <action
                android:id="@+id/action_a_to_b"
                app:destination="@id/b" />
            <action
                android:id="@+id/action_a_to_c"
                app:destination="@id/c" />
        </fragment>
        <fragment
            android:id="@+id/b"
            android:name="fragment.B"
            tools:layout="@layout/b_fragment"
            android:label="B" >
            <action
                android:id="@+id/action_b_to_d"
                app:destination="@id/d" />
        </fragment>
        <fragment
            android:id="@+id/c"
            tools:layout="@layout/c_fragment"
            android:name="fragment.C"
            android:label="C" >
            <action
                android:id="@+id/action_c_to_d"
                app:destination="@id/d"
                app:popUpTo="@id/a"/>
        </fragment>
        <fragment
            android:id="@+id/d"
            tools:layout="@layout/d_fragment"
            android:name="fragment.D"
            android:label="D" />
    </navigation>

Когда вы выбираете путь : A-> B-> D ваш задний стек A, B, D, и когда вы звоните NavigateUp(), вы go возвращаетесь к B.

Теперь путь A -> C - > D имеет незначительное добавление в теге action, как вы можете видеть

    <action
    android:id="@+id/action_c_to_d"
    app:destination="@id/d"
    app:popUpTo="@id/a"/>

, имеет popUpTo , поэтому при переходе от C к D app:popUpTo говорит библиотеке навигации, чтобы некоторые пункты назначения покинули задний стек как часть вызова navigate(), поэтому после перехода к D ваш задний стек A, D и NavigateUp() возвращает вас к A

1 голос
/ 19 апреля 2020

Итак, когда вы находитесь во фрагменте D и нажимаете кнопку «назад». Вы можете проверить стек фрагментов и проверить, например,

onBackPress(){
childFragmentManager.popbackstack()
val currentFragment = findFragmentByTag("FRAGMENT_B")
if(currentFragment == childFragmentManager.primaryNavigation()){
childFragmentManager.popbackstack()
}

NOTE

Вышеупомянутый фрагмент написан без редактора. Вы можете использовать эту логику c.

1 голос
/ 17 апреля 2020

Я использую setPopUpTo для NavOptions, или вы можете использовать его также в xml документации

=> https://developer.android.com/reference/androidx/navigation/NavOptions.Builder#setPopUpTo (int,% 20boolean)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...