Навигация popUpTo и PopUpToInclusive не очищают backstack - PullRequest
0 голосов
/ 01 мая 2019

Я новичок в архитектуре Android Jetpack Navigation.Я пробую это в новом приложении.Есть одно действие и несколько фрагментов, два из них - экран входа в систему и экран входа в систему электронной почты.Я определил эти фрагменты в моих навигационных XML.Приложение выглядит следующим образом:

Login screenEmail Login screen

Что я хочу, после перехода на экран входа в систему электронной почты, когда я нажимаю назад, приложение закрывается.Значение бэк-стека для экрана входа в систему удалено.Я знаю, что экраны входа в систему не должны работать таким образом, но я все еще просто выясняю.

Я следовал документации от Google Начало работы с компонентом навигации .Было сказано, что использование app:popUpTo и apppopUpToInclusive="true" должно очистить backstack, но когда я нажимаю обратно на экране входа в систему электронной почты, он все равно возвращается к входу в систему, а не к выходу.

Итак, вот что яя пробовал.

nav_main.xml

<fragment android:id="@+id/loginFragment"
          android:name="com.example.myapp.ui.main.LoginFragment"
          android:label="@string/login"
          tools:layout="@layout/fragment_login" >

    <action
        android:id="@+id/action_login_to_emailLoginFragment"
        app:destination="@id/emailLoginFragment"
        app:popEnterAnim="@anim/slide_in_right"
        app:popExitAnim="@anim/slide_out_right"
        app:popUpTo="@+id/emailLoginFragment"
        app:popUpToInclusive="true"/>

</fragment>

<fragment android:id="@+id/emailLoginFragment"
          android:name="com.example.myapp.ui.main.EmailLoginFragment"
          android:label="EmailLoginFragment"
          tools:layout="@layout/fragment_login_email" />

LoginFragment.kt

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    binding.emailLoginButton.setOnClickListener {
        findNavController().navigate(R.id.action_login_to_emailLoginFragment)
    }

    return binding.root
}

Я дал событие нажатия кнопки.В нем я использовал Navigation Controller, чтобы перейти к экрану входа в систему электронной почты, присвоив ему идентификатор действия.В <action> есть app:popUpTo и app:popUpToInclusive="true".

После прочтения документации снова и снова, а также после прочтения множества вопросов StackOverflow я обнаружил, что эти свойства должны удалить мой экран входа в системус заднего стека.Но они этого не делают.Кнопка переходит к экрану входа в систему электронной почты, но когда я нажимаю назад, она все равно возвращается к экрану входа в систему вместо выхода из приложения.Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 16 мая 2019
<action
        android:id="@+id/action_login_to_emailLoginFragment"
        app:destination="@id/emailLoginFragment"
        app:popEnterAnim="@anim/slide_in_right"
        app:popExitAnim="@anim/slide_out_right"
        app:popUpTo="@+id/loginFragment"
        app:popUpToInclusive="true"/>

Ваш popUpTo возвращается к логину электронной почты, а затем выскакивает его из-за включенного. Если вы измените popUpTo на свой фрагмент входа в систему, он будет перемещен обратно и также извлечен из-за включающего флага, который приведет к вашему желаемому поведению.

0 голосов
/ 21 июля 2019

Эти две строки заставляют трюк работать:

Если вы хотите перейти от А к В и рассчитывать закончить А:

Вам нужно позвонить B с этим действием:

    <fragment
        android:id="@+id/fragmentA"            
        tools:layout="@layout/fragment_a">

        <action
            android:id="@+id/action_call_B"
            app:destination="@+id/fragmentB"
            app:popUpTo="@id/fragmentA"
            app:popUpToInclusive="true" />

    </fragment>

    <fragment
        android:id="@+id/fragmentB"
        tools:layout="@layout/fragment_b">


    </fragment>

Если вы поместите журнал в свои фрагменты, вы увидите, что фрагментA уничтожается после вызова фрагмента B с этим действием.

...