1

我遇到了一个问题,即当深度链接到 2 级片段时,导航 UI 没有选择正确的底部导航视图项。

这就是我的意思:

  • 选择fragment_reading_lists:选择了正确的底部导航项
  • fragment_reading_lists -> fragment_discover_landing导航:选择了正确的底部导航项
  • 到fragment_reading_lists的深层链接:选择了正确的底部导航项
  • !!指向fragment_discover_landing的深层链接:未选择正确的底部导航项!!

当我深层链接到 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" />

    <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 的第一个片段

4

1 回答 1

0

根据深度链接文档

当用户通过显式深层链接打开您的应用程序时,任务返回堆栈将被清除并替换为深层链接目标。嵌套图时,每个嵌套级别的起始目的地(即层次结构中每个元素的起始目的地)也会添加到堆栈中。

因此,当您进行深度链接时fragment_discover_landing,回栈是mobile_navigation, fragment_home, then fragment_discover_landing。由于fragment_reading_lists不是startDestination图形的一个,因此没有将其添加到后堆栈中,因此,选择“适当”选项卡的使用者永远不会看到该目的地OnDestinationChangedListenersetupWithNavController

如果你想fragment_reading_lists在你的后台堆栈上,它需要是包含你的fragment_discover_landing目的地的嵌套图的 startDestination:

<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>

请注意,根据设计导航图文档

[嵌套图] 还提供了一定程度的封装——嵌套图之外的目的地无法直接访问嵌套图中的任何目的地。

所以这会产生副作用,这样你fragment_discover_landing就不会被fragment_reading_lists. 此问题通过深层链接跟踪导航,这将允许您通过附加到它的 URL 深层链接从应用程序中的任何位置访问目标,但它尚不可用。

于 2019-04-02T21:14:32.003 回答