Как отключить обратную навигацию и удалить стрелку назад на фрагменте с помощью компонента навигации Android Jetpack?

Я использую рекомендованный Google шаблон единого действия с компонентом навигации Android Jetpack.

Фрагмент 1 - это экран аутентификации. После аутентификации пользователя и перехода к фрагменту 2 я хотел бы, нажав кнопку «Назад» Android, закрыть приложение и удалить стрелку назад на панели приложения.

Я нашел такие методы, как onBackPressedDispatcher, для добавления / удаления функций обратной печати, но ничего, что также удаляет стрелку назад.

Я также пробовал app:popUpTo="@+id/firstFragment" при переходе от фрагмента 1 к фрагменту 2, но это тоже не работает.

Это должно быть возможно указать одной строкой кода. Все еще пытаюсь найти. Какие-нибудь советы?


person efa303    schedule 20.12.2019    source источник
comment
это то, что вы ищете stackoverflow.com/a/56670377/8914336   -  person coroutineDispatcher    schedule 20.12.2019


Ответы (1)


Вам нужно удалить fragment1 из back-stack при переходе к fragment2

фрагмент1

<fragment
android:id="@+id/fragment1"
android:name="packagenameforFragment1"
android:label="fragment1"
tools:layout="@layout/fragment_1" >
<action
    android:id="@+id/action_Fragment1_to_Fragment2"
    app:destination="@id/Fragment2_id"
    app:launchSingleTop="true"
    app:popUpTo="@+id/your_MainGraph_id"
    app:popUpToInclusive="true" />

then when you navigate from fragment1 to fragment2 call this

findNavController(fragment).navigate(R.id.action_Fragment1_to_Fragment2)

чтобы удалить кнопку возврата из Fragment2, вы можете использовать это

в Activity onCreate ()

val appBarConfiguration = AppBarConfiguration
        .Builder(R.id.your_fragment2_id,R.id.any_other_ids_you_want)
        .build()

затем настройте свою панель инструментов следующим образом

setupActionBarWithNavController(this, yourNavController, appBarConfiguration)
person Mohammed Alaa    schedule 20.12.2019
comment
Спасибо за ваш ответ - он позволяет удалить стрелку назад из фрагмента 2 и кнопку возврата, закрывающую приложение из фрагмента 2. Однако я обнаружил, что мне также нужно добавить свой идентификатор фрагмента1 в appBarConfiguration, иначе на фрагменте 1 будет отображаться стрелка назад. - person efa303; 23.12.2019
comment
@mohammed - отличное решение, если у вас нет DrawerLayout. В противном случае он будет отображаться вместо кнопки возврата, но ручка будет действовать как кнопка возврата. Это становится грязным. - person Houman; 09.10.2020
comment
@Houman Я думаю, что в этом случае вы можете использовать addOnDestinationChangedListener и показать, чтобы скрыть элементы управления на панели действий stackoverflow.com/a/62028322 - person Mohammed Alaa; 11.10.2020