首页 > 解决方案 > Kotlin Navigation Drawer 使用带有 RecyclerView 的导航组件作为菜单

问题描述

我的导航抽屉使用导航组件时遇到问题。我自定义了我的抽屉布局并添加了带有 Recycler View 的自定义导航视图。我在 NavigationView 内的 Grid View 中生成了我的自定义布局菜单。

问题是,当我通过单击网格视图中的任何项目进行导航时,它可以导航并且工作正常,但是当我再次单击以导航到另一个片段时,它会出现错误。如果我从主屏幕导航到另一个片段,导航工作正常,但如果我从一个片段导航到另一个片段,则导航不起作用。

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true" >
        <GridView
            android:id="@+id/gridview"
            android:layout_width="match_parent"
            android:layout_height="170dp"
            android:layout_below="@+id/photoContainer"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:columnWidth="74dp"
            android:gravity="center_horizontal|center_vertical"
            android:horizontalSpacing="10dp"
            android:numColumns="auto_fit"
            android:stretchMode="columnWidth"
            android:verticalSpacing="10dp" />
    </com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>

MainActivity.kt

val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        drawerLayout.setScrimColor(Color.TRANSPARENT)
        val toggle = ActionBarDrawerToggle(
                this,
                drawerLayout,
                toolbar,
                R.string.navigation_drawer_open,
                R.string.navigation_drawer_close
        )
        drawerLayout.addDrawerListener(toggle)
        toggle.syncState()

        val navView: NavigationView = findViewById(R.id.nav_view)

        val width = resources.displayMetrics.widthPixels
        val params = nav_view.layoutParams as DrawerLayout.LayoutParams
        params.width = width
        nav_view.layoutParams = params
        val menus = arrayOf("Photo", "Video")
        val icon = intArrayOf(
                R.drawable.ic_menu_photo,
                R.drawable.ic_menu_video)
        val iconSelected = intArrayOf(
                R.drawable.ic_menu_photo,
                R.drawable.ic_menu_video)
menuData = ArrayList<MenuNavigationModel>()
        for (i in menus.indices) {
            val menu = MenuNavigationModel()
            menu.menuName = menus[i]
            menu.menuIcon = icon[i]
            menuData!!.add(menu)
        }
        gridView = findViewById(R.id.gridview) as GridView
        adapter = MenuNavigationAdapter(this, menuData!!)
        gridView!!.adapter = adapter

gridView!!.onItemClickListener = OnItemClickListener { parent, v, i, id ->
            try {
                if(i === 0)
                    findNavController(R.id.main_nav_fragment).navigate(R.id.action_homeFragment_to_photoFragment)

                if(i === 1)
                    findNavController(R.id.main_nav_fragment).navigate(R.id.homeFragment_to_videoFragment)
            }catch (e: Exception){
                Toast.makeText(this, e.message, Toast.LENGTH_SHORT).show()
                Log.e("Error_Nav", e.message.toString())
            }
            val drawer = findViewById(R.id.drawer_layout) as DrawerLayout
            drawer.closeDrawer(GravityCompat.START)
    }

它返回给我这个错误:从当前目的地目的地找不到导航动作/目的地是的,我知道它说导航中没有提供该动作,但是我如何告诉我的gridview动态处理这个像菜单项一样。请指导执行此操作的更好方法。

标签: androidkotlinandroid-fragmentsdrawerlayoutandroid-navigationview

解决方案


推荐阅读