当前位置: 首页 > 知识库问答 >
问题:

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

贲铭
2023-03-14

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

我的意思是:

  • 选择fragment_reading_lists:选择正确的底部导航项
  • 从fragment_reading_lists导航-

当我深入链接到fragment\u discover\u 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\u reading\u lists是底部导航中item2的第一个片段

共有1个答案

印瑾瑜
2023-03-14

根据深度链接留档:

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

因此,当您深度链接到fragment_discover_landing时,后栈是mobile_navigationfragment_home,然后是fragment_discover_landing。由于fragment_reading_lists不是图的start Destation,因此它不会添加到后栈中,因此setupSusNavController用于选择适当选项卡的OnDestinationChangedListener永远不会看到该目的地。

如果要在后堆栈上显示片段读取列表,则它需要是包含片段发现着陆的嵌套图的起始目标:

<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\u discover\u landingfragment\u reading\u列表之外的任何目的地都看不到。本期通过深度链接跟踪导航,该链接允许您通过附加到应用程序的URL深度链接从应用程序中的任何位置访问目的地,但目前尚不可用。

 类似资料:
  • 我的应用程序有问题。我有一个底部导航视图,包含3个不同的片段,尽管目前只有主要的内容。当我试图从左侧的两个片段中的一个移动到主视图时,问题就出现了,即当底部导航视图被隐藏时。我附上了主代码。 PD:我有25.3.1版本的所有库(如果有用的话)。 感谢您的关注。 activity\u main。xml 主要活动。Java语言 我也给你添加了两张图片。 Ofertas片段 主片段

  • 但是,当我初始化BottomNavigationView时,我会得到: 我正在从一个片段初始化BottomNativigationView。我猜这就是问题所在,但我想不出解决办法。 下面是为片段设置导航的活动的BottomNavigationView xml。

  • 我实现了一个bottomNavigationView,其中每个选项都有其条目片段,有些选项在同一个选项下有更多的导航。 某种程度上是这样的: A- B类- C类- D- E类- 其中A, B, C, D 所需的导航是,应用程序的入口和出口点始终是选项A(入口片段A1)。因此,如果用户导航到另一个选项,只要该选项位于该选项的条目片段中,任何反向导航的行为都应该转到选项A。 我遇到的问题是,botto

  • 我有一个关于底部导航栏的奇怪问题,虽然我花了大量时间在它上面,但我无法解决。当我以“推荐”的方式(从许多教程中)使用它时,它就是无法导航。 那么,我所说的“推荐”方式是什么意思呢:我有一个单独的acticity,其中有一个名为“MainActivity”的navHostFragment。这个主要活动有一个XML布局文件,我将底部导航栏放在其中。BottomNavigationBar还有一个XML布

  • 实现tabbar建议采用小程序原生的tabbar,通过设置page/main.js(即对应小程序中app.json)来实现,详情请看小程序文档。示例如下,仅作参考: tabBar: { color: '#999999', selectedColor: '#1AAD16', backgroundColor: '#ffffff', borderStyle: 'white', /*

  • 我正在将我的应用程序转换为使用一个活动并添加了BottomNavigationView,并努力防止在片段之间导航时重新创建片段,进行不必要的api调用。但是我无法使它工作: 不显示片段 图标未切换 触摸底部菜单项不会切换片段 触摸所选项目会使应用崩溃,并带有 TypeCastException: 活动的布局: 底部导航菜单: 在主活动中: 导航扩展: 屏幕为空白,未呈现任何片段视图。 有人能帮我解