Навигация по Android Jetpack - Уведомление снизу Навигация о правильном предмете - PullRequest
0 голосов
/ 01 апреля 2019

Я столкнулся с проблемой, когда пользовательский интерфейс навигации не выбирает правильный нижний элемент представления навигации при глубокой привязке к фрагменту 2-го уровня.

Вот что я имею в виду:

  • выбрать фрагмент_читания_листов : выбран правильный нижний элемент навигации
  • навигация из фрагмента_четов_списков -> фрагмента_обнаружения_лайдинга : правильный нижний элемент навигации выбран
  • глубокая ссылка на фрагмент_читания_листов : выбран правильный нижний навигационный элемент
  • !! глубокая ссылка на frag_discover_landing : правильный нижний навигационный элемент НЕ выбран !!

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

Есть ли способ уведомить нижний навигационный адаптер о том, какой пункт СЛЕДУЕТ выбрать в этом случае?

Вот мой навигационный график:

<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/fragment_home">

    <fragment
        android:id="@+id/fragment_home"
        android:name="com.my.app.fragments.HomeFragment"
        android:label="@string/nav_home"
        tools:layout="@layout/home_fragment">
        <action
            android:id="@+id/action_fragment_home_to_fragment_browse_categories"
            app:destination="@id/fragment_browse_categories" />
    </fragment>

    <fragment
        android:id="@+id/fragment_browse_categories"
        android:name="com.my.app.fragments.BrowseCategoriesFragment"
        android:label="@string/discover_default_header"
        tools:layout="@layout/browse_categories_fragment" />

    <fragment
        android:id="@+id/fragment_reading_lists"
        android:name="com.my.app.fragments.ReadingListHubFragment"
        android:label="@string/nav_readinglists"
        tools:layout="@layout/readinglists_landing">
        <action
            android:id="@+id/action_fragment_reading_lists_to_fragment_discover_landing"
            app:destination="@id/fragment_discover_landing" />
    </fragment>

    <fragment
        android:id="@+id/fragment_browse_library"
        android:name="com.my.app.fragments.BrowseLibraryFragment"
        android:label="@string/nav_library"
        tools:layout="@layout/fragment_mylibrary_all" />

    <fragment
        android:id="@+id/fragment_downloads"
        android:name="com.my.app.fragments.DownloadsFragment"
        android:label="@string/nav_downloads"
        tools:layout="@layout/fragment_mylibrary_offline" />

    <fragment
        android:id="@+id/fragment_discover_landing"
        android:name="com.my.app.fragments.DiscoverLandingFragment"
        android:label="@string/nav_discover_landing"
        tools:layout="@layout/discover_landing_fragment">

        <action
            android:id="@+id/fragment_discover_landing_back_action"
            app:popUpTo="@id/fragment_reading_lists"
            app:popUpToInclusive="false" />
        <argument
            android:name="category"
            android:defaultValue="Latest"
            app:argType="string" />
        <argument
            android:name="searchText"
            app:argType="string" />
        <argument
            android:name="searchMode"
            android:defaultValue="false"
            app:argType="boolean" />
        <deepLink
            android:id="@+id/discover_landing_category"
            app:uri="myApp://discover/category?name={category}" />
    </fragment>
</navigation>

СТОРОННОЕ ПРИМЕЧАНИЕ: ни один из этих фрагментов не является начальным пунктом назначения. Это домашний фрагмент, который является item1 в нижней части навигации. Fragment_reading_lists - первый фрагмент для item2 в нижней части nav

1 Ответ

0 голосов
/ 03 апреля 2019

Согласно документации для глубоких ссылок :

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

Поэтому, когдаВаша глубокая ссылка на fragment_discover_landing, обратный стек mobile_navigation, fragment_home, затем fragment_discover_landing.Поскольку fragment_reading_lists не является startDestination графика, он не добавляется в задний стек и, следовательно, OnDestinationChangedListener, который setupWithNavController использует для выбора соответствующей вкладки, никогда не видит этого места назначения.

Если вы хотите, чтобы fragment_reading_lists находился в вашем заднем стеке, он должен быть startDestination вложенного графа, содержащего ваш fragment_discover_landing пункт назначения:

<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/fragment_home">

    <fragment
        android:id="@+id/fragment_home"
        android:name="com.my.app.fragments.HomeFragment"
        android:label="@string/nav_home"
        tools:layout="@layout/home_fragment">
        <action
            android:id="@+id/action_fragment_home_to_fragment_browse_categories"
            app:destination="@id/fragment_browse_categories" />
    </fragment>

    <fragment
        android:id="@+id/fragment_browse_categories"
        android:name="com.my.app.fragments.BrowseCategoriesFragment"
        android:label="@string/discover_default_header"
        tools:layout="@layout/browse_categories_fragment" />

    <!-- Make sure to change your menu.xml to use @+id/reading_lists -->
    <navigation
        android:id="@+id/reading_lists"
        app:startDestination="@+id/fragment_reading_lists">

        <fragment
            android:id="@+id/fragment_reading_lists"
            android:name="com.my.app.fragments.ReadingListHubFragment"
            android:label="@string/nav_readinglists"
            tools:layout="@layout/readinglists_landing">
            <action
                android:id="@+id/action_fragment_reading_lists_to_fragment_discover_landing"
                app:destination="@id/fragment_discover_landing" />
        </fragment>

        <fragment
            android:id="@+id/fragment_discover_landing"
            android:name="com.my.app.fragments.DiscoverLandingFragment"
            android:label="@string/nav_discover_landing"
            tools:layout="@layout/discover_landing_fragment">

            <action
                android:id="@+id/fragment_discover_landing_back_action"
                app:popUpTo="@id/fragment_reading_lists"
                app:popUpToInclusive="false" />
            <argument
                android:name="category"
                android:defaultValue="Latest"
                app:argType="string" />
            <argument
                android:name="searchText"
                app:argType="string" />
            <argument
                android:name="searchMode"
                android:defaultValue="false"
                app:argType="boolean" />
            <deepLink
                android:id="@+id/discover_landing_category"
                app:uri="myApp://discover/category?name={category}" />
        </fragment>

    </navigation>

    <fragment
        android:id="@+id/fragment_browse_library"
        android:name="com.my.app.fragments.BrowseLibraryFragment"
        android:label="@string/nav_library"
        tools:layout="@layout/fragment_mylibrary_all" />

    <fragment
        android:id="@+id/fragment_downloads"
        android:name="com.my.app.fragments.DownloadsFragment"
        android:label="@string/nav_downloads"
        tools:layout="@layout/fragment_mylibrary_offline" />
</navigation>

Обратите внимание, что согласно Design навигациядокументация графиков :

[вложенные графики] также обеспечивают уровень инкапсуляции - пункты назначения вне вложенного графа не имеют прямого доступа ни к одному из пунктов назначения во вложенном графе.

Таким образом, это может иметь побочный эффект, так что ваш fragment_discover_landing не будет виден ни одному месту назначения за пределами fragment_reading_lists. Эта проблема отслеживает навигацию по глубокой ссылке, которая позволит вам получить доступ к пункту назначения из любой точки вашего приложения по добавленной к нему URL-ссылке, но она пока недоступна.

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