Android Jetpack导航-如何从抽屉菜单项导航到嵌套导航图

时间:2020-03-25 05:47:26

标签: android android-jetpack android-navigation android-jetpack-navigation android-drawer

我很好奇,如何使用Android Jetpack的导航图从抽屉布局中的菜单项导航到嵌套的导航图。我知道幕后有一些魔术可以将菜单项与基于ID的片段链接起来,但是我不知道如何将菜单项链接到嵌套的导航图。

例如,我使用的是Android Studio随附的默认“导航抽屉活动”项目。我已将mobile_navigation.xml修改为以下内容:

<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/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="com.example.testdrawer.ui.home.HomeFragment"
        android:label="@string/menu_home"
        tools:layout="@layout/fragment_home" />

    <include app:graph="@navigation/nested_navigation" />

    <fragment
        android:id="@+id/nav_tools"
        android:name="com.example.testdrawer.ui.tools.ToolsFragment"
        android:label="@string/menu_tools"
        tools:layout="@layout/fragment_tools" />

    <fragment
        android:id="@+id/nav_share"
        android:name="com.example.testdrawer.ui.share.ShareFragment"
        android:label="@string/menu_share"
        tools:layout="@layout/fragment_share" />

    <fragment
        android:id="@+id/nav_send"
        android:name="com.example.testdrawer.ui.send.SendFragment"
        android:label="@string/menu_send"
        tools:layout="@layout/fragment_send" />
</navigation>

我还添加了一个名为nested_navigation.xml的新导航图,其外观如下:

<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/nested_navigation"
    app:startDestination="@+id/nav_gallery">

    <fragment
        android:id="@+id/nav_gallery"
        android:name="com.example.testdrawer.ui.gallery.GalleryFragment"
        android:label="@string/menu_gallery"
        tools:layout="@layout/fragment_gallery" />

    <fragment
        android:id="@+id/nav_slideshow"
        android:name="com.example.testdrawer.ui.slideshow.SlideshowFragment"
        android:label="@string/menu_slideshow"
        tools:layout="@layout/fragment_slideshow" />

</navigation>

假设我的菜单如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_menu_camera"
            android:title="@string/menu_home" />
        <item
            android:id="@+id/nested_navigation"
            android:icon="@drawable/ic_menu_gallery"
            android:title="Photos Graph" />
        <item
            android:id="@+id/nav_tools"
            android:icon="@drawable/ic_menu_manage"
            android:title="@string/menu_tools" />
    </group>

    <item android:title="Communicate">
        <menu>
            <item
                android:id="@+id/nav_share"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/menu_share" />
            <item
                android:id="@+id/nav_send"
                android:icon="@drawable/ic_menu_send"
                android:title="@string/menu_send" />
        </menu>
    </item>

</menu>

因此,从本质上讲,我只是想知道如何单击抽屉中的菜单项,导航到嵌套导航图的起始目标。

编辑: 我已经知道如何通过实现NavigationView.OnNavigationItemSelectedListener接口并通过全局操作手动触发导航来实现此目的:

override fun onNavigationItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.nested_navigation -> {
                findNavController(R.id.nav_host_fragment).navigate(R.id.action_nested_navigation)
            }
        }

        drawer_layout.closeDrawer(GravityCompat.START)
        return true
    }

尽管如此,我仍然希望可以通过自动命名约定来实现此目的。

非常感谢任何帮助,非常感谢!

1 个答案:

答案 0 :(得分:0)

实际上,我以一种非常标准的方式进行这项工作。您的XML文件看起来还不错,但是您是否还将R.id.nested_navigation包含到AppBarConfiguration中的topLevelDestinationIds中?

    val navController = findNavController(R.id.nav_host_fragment)
    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.nav_home,
            R.id.nav_tools,
            R.id.nav_share,
            R.id.nav_send.
            R.id.nested_navigation
        ),
        drawerLayout
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)

如果这不能解决您的问题,请共享您的代码以设置导航视图。