Предотвращение круговой логики навигации в BottomNavigationView с использованием компонента навигации - PullRequest
0 голосов
/ 01 июня 2019

У меня BottomNavigationView подключено до 3 фрагментов (A, B и C) через компонент Navigation . У меня также есть фрагмент входа в систему, который я удаляю из стека после успешного входа.

Наблюдаемое поведение при навигации:

A> B> C> A> B> C> B> Назад > C> Назад > B> Назад > A> Назад > Выход

Ожидаемое поведение:

(после прочтения комментариев @ianhanniballake и Принципы навигации )

A> B> C> A> B> C> B> Назад > A> Назад > Выход

Моя проблема похожа на круговую навигационную логику , но у меня она есть в BottomNavigationView. Как добиться моего ожидаемого поведения?

main_nav.xml

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

    <fragment
        android:id="@+id/login_fragment"
        android:name="com.example.app.LoginFragment"
        android:label="Login">

        <action
            android:id="@+id/login_action"
            app:destination="@id/home_fragment"
            app:launchSingleTop="true"
            app:popUpTo="@id/main_nav"
            app:popUpToInclusive="true" />

    </fragment>

    <!-- Fragments A, B and C tied to BottomNavigationView-->

</navigation>

BottomNavigationView настройка

navController = findNavController(R.id.main_nav_host)
mainActivityBinding.bottomNavView.setupWithNavController(navController)

Ответы [ 2 ]

1 голос
/ 02 июня 2019

В этом случае вам нужно настроить поток входа в систему в виде вложенного графа внутри основного графика навигации.

Ваш начальный пункт назначения должен быть назначен одному из 3фрагменты подключены к вашему BottomNavigationView, так что нажатие Назад выводит пользователя на этот экран перед выходом из приложения.

В вашем HomeFragment (начальном назначении) вы можете проверить,пользователь вошел в систему и, при необходимости, перейдет к вложенному графу входа в систему.

HomeFragment.kt

if (!isLoggedIn) {
    val action = HomeFragmentDirections.showLogin()
    findNavController().navigate(action)
} else {
    // show bottom nav
}

Вам придется обрабатывать скрытие / отображениеBottomNavigationView по мере необходимости.

Ваш обновленный график навигации будет выглядеть следующим образом:

main_nav.xml

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

    <fragment
        android:id="@+id/home"
        android:name="com.example.app.HomeFragment"
        android:label="Home">

        <action
            android:id="@+id/show_login"
            app:destination="@id/login_nav"/>

    </fragment>

    <!-- Fragments B and C -->

    <include app:graph="@navigation/login_nav"/>

</navigation>
0 голосов
/ 01 июня 2019

'в вашем основном действии переопределите метод обратной связи и завершите задание следующим образом.'

@Override
    public void onBackPressed() {

        finish();

    }

'это решит вашу проблему'

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