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

У меня есть действие Dashboard Activity, в котором есть фрагмент и нижнее меню навигации, которое настроено следующим образом в DashboardActivity.kt:

setContentView(R.layout.activity_dashboard)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
navView.setupWithNavController(navController)

В нижней части навигации есть 3 элемента: @+id/navigation_scoreboard , @+id/navigation_dashboard и @+id/navigation_gamesettings

В моем @+id/navigation_dashboard нижнем пункте навигационного меню - пользователь может ввести некоторые данные в поле ввода и нажать кнопку, на которой я выполняю вызов API и перехожу к результату screen, @+id/slipup_result_fragment, при успешном вызове API с использованием навигации + наблюдателей за данными в реальном времени.

Теперь проблема: Когда я ухожу от экрана результатов, @+id/slipup_result_fragment, скажем, перейдя к другому элементу в нижнем навигационном меню, а затем нажмите элемент меню для @+id/navigation_dashboard, я снова попадаю на экран результатов, а не на исходный фрагмент - @+id/navigation_dashboard, и, похоже, не могу найти способ вернуться к go к исходному фрагменту.

Что я здесь делаю не так?

Обновление: график навигации для фрагмента в Dashboard Activity выглядит следующим образом:

<?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/mobile_navigation"
    app:startDestination="@+id/navigation_scoreboard">

    <fragment
        android:id="@+id/navigation_scoreboard"
        android:name="com.ezchange.mvp.ui.scoreboard.ScoreboardFragment"
        android:label="@string/title_scoreboard"
        tools:layout="@layout/fragment_scoreboard" />

    <fragment
        android:id="@+id/navigation_dashboard"
        android:name="com.ezchange.mvp.ui.slipup.SlipUpFragment"
        android:label="@string/title_slipup"
        tools:layout="@layout/fragment_slipup" >
        <action
            android:id="@+id/action_navigation_dashboard_to_slipUpResultFragment"
            app:destination="@id/slipup_result_fragment"
            app:popUpTo="@id/navigation_dashboard"
            app:popUpToInclusive="true" />
    </fragment>

    <fragment
        android:id="@+id/navigation_gamesettings"
        android:name="com.ezchange.mvp.ui.gamesettings.GameSettingsFragment"
        android:label="@string/title_game_settings"
        tools:layout="@layout/fragment_game_settings" />

    <fragment
        android:id="@+id/slipup_result_fragment"
        android:name="com.ezchange.mvp.ui.slipup.SlipUpResultFragment"
        android:label="fragment_slip_up_result"
        tools:layout="@layout/fragment_slip_up_result" >
        <action
            android:id="@+id/action_slipUpResultFragment_to_navigation_scoreboard"
            app:destination="@id/navigation_scoreboard" />
    </fragment>

</navigation>

Обновление №2: нижнее меню XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/navigation_scoreboard"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_scoreboard" />

    <item
        android:id="@+id/navigation_dashboard"
        android:icon="@drawable/ic_dashboard_black_24dp"
        android:title="@string/title_slipup" />

    <item
        android:id="@+id/navigation_gamesettings"
        android:icon="@drawable/ic_notifications_black_24dp"
        android:title="@string/title_game_settings" />

</menu>

1 Ответ

0 голосов
/ 01 августа 2020

Когда вы перемещаетесь с помощью action_navigation_dashboard_to_slipUpResultFragment навигационного контроллера, у вас есть следующая информация -

SlipUpFragment -> SlipUpResultFragment

при навигации вверх он без проблем перенесет вас в SlipUpFragment.

После перехода к navigation_gamesettings навигация должна иметь следующую информацию -

SlipUpFragment -> SlipUpResultFragment -> GameSettingsFragment

, но такого action_slipUpResultFragment_to_navigation_gamesettings нет, поэтому при навигации контроллер навигации будет потерян.

Таким образом, должно быть действие SlipUpResultFragment следующим образом -

<fragment
    android:id="@+id/slipup_result_fragment"
    android:label="fragment_slip_up_result"
    android:name="com.ezchange.mvp.ui.slipup.SlipUpResultFragment"
    tools:layout="@layout/fragment_slip_up_result">

    <action
        android:id="@+id/action_slipUpResultFragment_to_navigation_gamesettings"
        app:destination="@id/navigation_gamesettings"
        app:popUpTo="@+id/navigation_dashboard"
        app:popUpToInclusive="true" />
    <action
        android:id="@+id/action_slipUpResultFragment_to_navigation_scoreboard"
        app:destination="@id/navigation_scoreboard"
        app:popUpTo="@+id/navigation_dashboard"
        app:popUpToInclusive="true" />
</fragment>

добавление app:popUpToInclusive="true" и app:popUpTo="@+id/navigation_dashboard", чтобы убедиться, что при навигации вверх он приведет вас к SlipUpFragment не к SlipUpResultFragment снова.

Edit 1

Использование следующего NavGraph дает желаемый результат - PSR результата

<?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/mobile_navigation"
    app:startDestination="@+id/navigation_home">

    <fragment
        android:id="@+id/navigation_home"
        android:name="com.example.bottomnavigationtest.ui.home.HomeFragment"
        android:label="@string/title_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/navigation_dashboard"
        android:name="com.example.bottomnavigationtest.ui.dashboard.DashboardFragment"
        android:label="@string/title_dashboard"
        tools:layout="@layout/fragment_dashboard" >
        <action
            android:id="@+id/action_navigation_dashboard_to_detailsFagment"
            app:destination="@id/detailsFagment" />

    </fragment>

    <fragment
        android:id="@+id/navigation_notifications"
        android:name="com.example.bottomnavigationtest.ui.notifications.NotificationsFragment"
        android:label="@string/title_notifications"
        tools:layout="@layout/fragment_notifications" >
    </fragment>

    <fragment
        android:id="@+id/detailsFagment"
        android:name="com.example.bottomnavigationtest.ui.dashboard.details.DetailsFagment"
        android:label="fragment_details_fagment"
        tools:layout="@layout/fragment_details_fagment" >
        <action
            android:id="@+id/action_detailsFagment_to_navigation_home"
            app:destination="@id/navigation_home" />
    </fragment>

</navigation>

Удачного кодирования!

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