-1

我知道这已经问了很多次了,但就我而言,我仍然不明白。

MainActivity.kt因此,我在(我的应用程序有许多在此 Activity 上运行的片段)中设置了一个导航抽屉。

MainActivity.kt

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    lateinit var drawerLayout: DrawerLayout
    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)

        drawerLayout = binding.drawerLayout

        //Get navigation controller of this App
        val navController = this.findNavController(R.id.myNavHostFragment)

        //Lock the Nav drawer
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)

        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
        NavigationUI.setupWithNavController(binding.navView, navController)
    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.nav_logout -> {
                Toast.makeText(this, "Publication", Toast.LENGTH_SHORT).show()
                Log.i("MainActivity", "Sign out clicked!")
            }
            R.id.nav_messages -> {
                Toast.makeText(this, "Publication", Toast.LENGTH_SHORT).show()
            }
        }    

        binding.drawerLayout.closeDrawer(GravityCompat.START)
        return true
    }

    // Set up the back button on action bar
    override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.myNavHostFragment)

        return NavigationUI.navigateUp(navController, drawerLayout)
    }
}

这是我的 Activity_main.xml

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.drawerlayout.widget.DrawerLayout
        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">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

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

        </LinearLayout>

        <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"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/nav_drawer_menu"/>

    </androidx.drawerlayout.widget.DrawerLayout>

</layout>

这是导航抽屉的菜单布局: nav_drawer_menu.xml

<?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group>
        <item
            android:id="@+id/nav_profile"
            android:icon="@drawable/ic_person"
            android:title="Profile"/>
        <item
            android:id="@+id/nav_messages"
            android:icon="@drawable/ic_people"
            android:title="Messages"/>
    </group>


    <item android:title="Account Settings">
        <menu>
            <item
                android:id="@+id/nav_logout"
                android:title="Sign Out"/>
        </menu>
    </item>
</menu>

就是导航抽屉的样子。

我错过了什么吗?如果有什么不清楚的,请告诉我。

4

2 回答 2

4

你应该使用setNavigationItemSelectedListener.

设置在选择菜单项时将通知的侦听器。

 navigationViewOBJ.setNavigationItemSelectedListener(this) 

DataBinding你应该使用

 binding.navView.setNavigationItemSelectedListener(this) 
于 2020-06-01T07:33:44.157 回答
1

我遇到了同样的问题,我以这种方式更改了我的代码,以便在选择 Menuitems 时获得 Toast。

  1. NavigationView.OnNavigationItemSelectedListener

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener

  1. 在 MianActivity.kt 的 MainActivity 类中创建了一个变量

private lateinit var navView : NavigationView

  1. 通过查找像这样的导航视图ID,在像这样覆盖有趣的onCreate函数中分配navView变量

navView = findViewById(R.id.nav_menu)

在您的情况下,在本节下的 activity_main.xml 中

            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/nav_drawer_menu"/>
  1. 然后我为onclick select实现了这个功能

navView.setNavigationItemSelectedListener {}

我在这个函数中编写了与您的代码相同的 switch case,现在它对我来说很好。

于 2021-09-20T07:40:26.343 回答