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

Android导航组件子导航

何骞尧
2023-03-14

我正在一个新的Android应用程序上使用导航组件,但我不知道怎么做

首先,我有我的主活动,我有main_navigation_graph

主要活动 NavHostFragment

<fragment
    android:id="@+id/main_navigation_host_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/main_navigation_graph"
    app:defaultNavHost="true"/>

main_navigation_graph里面有3个碎片

这里一切都很好。问题是当我到达最后一个片段时,因为在这个片段上,我想根据BottomNavigationView输入(暂时)显示一些子片段(在新的NavHostFragment中)

LastFragment:

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFF">

<fragment
    android:id="@+id/dash_board_navigation"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toTopOf="@id/dash_board_bottom_navigation"
    app:navGraph="@navigation/dash_board_navigation_graph" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/dash_board_bottom_navigation"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:menu="@menu/main_menu_navigation"
    app:labelVisibilityMode="labeled"
    android:background="@color/main_menu_background"
    app:itemIconTint="@color/main_menu_item_color"
    app:itemTextColor="@color/main_menu_item_color"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent" />

dash_board_navigation_graph

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/dash_board_navigation_graph"
    app:startDestination="@id/destination_home_fragment">

    <action
        android:id="@+id/dash_board_action1"
        app:destination="@id/destination_fragment1"/>

    <action
        android:id="@+id/dash_board_action2"
        app:destination="@id/destination_fragment2"/>

    <action
        android:id="@+id/dash_board_action3"
        app:destination="@id/destination_fragment3"/>

    <action
        android:id="@+id/dash_board_action4"
        app:destination="@id/destination_fragment4"/>

    <fragment
        android:id="@+id/destination_fragment1"
        android:name="com.....Fragment1">
    </fragment>

    <fragment
        android:id="@+id/destination_fragment2"
        android:name="com.....Fragment2">
    </fragment>

    <fragment
        android:id="@+id/destination_fragment3"
        android:name="com.....Fragment3">
    </fragment>

    <fragment
        android:id="@+id/destination_fragment4"
        android:name="com.....Fragment4">
    </fragment>

当我用下面的代码触发最后一个片段中的这些动作时:

findNavController().navigate(R.id.dash_board_action1/2/3)

我得到这个例外:

java.lang.IllegalArgumentException: navigation destination com.asperitass.mobile:id/dash_board_home_action is unknown to this NavController

我的问题是:我的方法正确吗?或者这(具有多个级别的导航)是可能的?或者我应该使用<code>childFragmentManager</code>来处理这个子导航,并在片段中膨胀框架布局?

共有1个答案

刘凡
2023-03-14

因此,据我所知,您嵌套了两个NavHostFragment,因为您只希望在流(如lastFragment中的登录)之后有bottomNav,

据我所知,问题出在<code>findNavController()。导航(R.id.dash_board_action1/2/3)。由于您有两个NavHostFragments,因此还将有两个相应的NavController。

默认的< code > navigation . find NavController()将为您提供顶级的NavController,但是要在子navGraph中导航,您需要子nav controller,您可以通过

val fragmentContainer = view.findViewById<View>(R.id.dash_board_navigation)
navController         = Navigation.findNavController(fragmentContainer)

有关更多详细信息,请查看这个非常好的Stackoverflow答案https://stackoverflow.com/a/51500083/6269691

 类似资料:
  • 导航组件说明 组件 说明 最低版本 navigator 页面链接 1.0.0 functional-page-navigator 用于跳转插件功能页 不支持 navigator 属性 类型 默认值 必填 说明 最低版本 url string 否 当前小程序内的跳转链接 open-type navigate 否 跳转方式 hover-class string navigator-hover 否 指定

  • 本文向大家介绍Android组件创建DrawerLayout导航,包括了Android组件创建DrawerLayout导航的使用技巧和注意事项,需要的朋友参考一下 概述 本篇博客是对developer.android.com/上的Training课程的简单翻译,若是觉得翻译出来的理解有困难,请点击下方链接查看原文! 关于DrawerLayout的Training:http://developer.

  • 实际上,我正在我的应用程序中使用新的架构组件,并且我已经设置了导航组件。我有一个导航抽屉,我想用它。我已经设置好了,但我面临一些问题: 1-抽屉不会自动关闭。菜单正常工作并导航到正确的位置,但导航后不会关闭。我必须添加一个目的地ChangedListener才能自己关闭它。 在代码实验室里,抽屉自动关闭,我真的不明白为什么。 2-向上按钮打开抽屉。当我导航到非顶级片段时,菜单图标变为向上箭头,但当

  • 我试图遵循谷歌最新的良好实践,用导航组件实现单个活动应用程序。 然而,在阅读了整个导航留档后,我仍然认为有很多情况下,他们没有解决。 例如,我应该如何实现以下情况: 应用程序在闪屏中启动。然后在加载后进入新闻片段。 注意:闪屏应该从后台弹出,因为它不应该再出现了。 然而,部分中的一些片段可以导航到一个新区域,该区域应该有一个后退按钮(而不是抽屉)。

  • 我已经从连接到NavController的导航抽屉中导航到了DialogFragment。但当我导航到另一个目标时,我已经将弹出窗口设置为包含对话框片段,但它并没有清除堆栈。如何清除堆栈? AM从LogoutDialog调用此方法 我只使用片段和一个活动。 这是我导航图的一部分

  • 我正在将我的应用程序更新为导航架构组件,我发现它在替换导航抽屉中可见的片段时存在延迟,无法顺利关闭。 直到现在,我一直在遵循这种方法: https://vikrammnit.wordpress.com/2016/03/28/facing-navigation-drawer-item-onclick-lag/ 所以我在中导航而不是在中导航以避免故障。 这是一个非常常见的问题,但它又回来了。使用导航组