我遇到一个问题,即当深度链接到第二级片段时,导航UI不能选择正确的底部导航视图项。
这是我的意思:
当我深度链接到fragment_discover_landing时会发生什么?默认的底部导航项已选中。
有没有一种方法可以通知底部导航适配器在这种情况下应该选择哪个项目?
这是我的导航图:
Home/Index
侧面注意:这些片段都不是起始目标。那是首页片段,它是底部导航栏中的item1。 fragment_reading_lists是底部导航栏中item2的第一个片段
答案 0 :(得分:0)
当用户通过显式深层链接打开您的应用程序时,将清除任务后退堆栈,并将其替换为深层链接目标。当nesting graphs时,嵌套的每个级别的起始目标(即层次结构中每个元素的起始目标)也被添加到堆栈中。
因此,当您深入链接到fragment_discover_landing
时,后堆栈是mobile_navigation
,fragment_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_lists
。 This issue通过深层链接跟踪导航,这将使您可以通过附加到其的URL深层链接从应用程序中的任何位置访问目标,但尚不可用。