Android Jetpack导航-通知正确项目的底部导航视图

时间:2019-04-01 19:34:59

标签: android navigation bottomnavigationview android-jetpack android-jetpack-navigation

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

这是我的意思:

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

当我深度链接到fragment_discover_landing时会发生什么?默认的底部导航项已选中。

有没有一种方法可以通知底部导航适配器在这种情况下应该选择哪个项目?

这是我的导航图:

Home/Index

侧面注意:这些片段都不是起始目标。那是首页片段,它是底部导航栏中的item1。 fragment_reading_lists是底部导航栏中item2的第一个片段

1 个答案:

答案 0 :(得分:0)

按照deep link documentation

  

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

因此,当您深入链接到fragment_discover_landing时,后堆栈是mobile_navigationfragment_home,然后是fragment_discover_landing。由于fragment_reading_lists不是图形的startDestination,因此不会将其添加到后台堆栈,因此OnDestinationChangedListener用于选择适当选项卡的setupWithNavController永远不会出现那个目的地。

如果您想让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>

请注意,根据Design navigation graphs documentation

  

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

因此,这样做会产生副作用,以使fragment_discover_landing之外的任何目的地都看不到您的fragment_reading_listsThis issue通过深层链接跟踪导航,这将使您可以通过附加到其的URL深层链接从应用程序中的任何位置访问目标,但尚不可用。