繁体   English   中英

Kotlin Android 导航抽屉项目 onclick 监听器不工作

[英]Kotlin Android Navigation Drawer item onclick listener does not working

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

所以我在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>

就是导航抽屉的样子。

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

您应该使用setNavigationItemSelectedListener

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

 navigationViewOBJ.setNavigationItemSelectedListener(this) 

对于DataBinding你应该使用

 binding.navView.setNavigationItemSelectedListener(this) 

当Menuitems为select时,我遇到了同样的问题,我以这种方式更改了我的代码以获得Toast。

  1. 我从中删除了NavigationView.OnNavigationItemSelectedListener

class MainActivity: AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener

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

private lateinit var navView: NavigationView

  1. 通过找到像这样的导航视图ID,在覆盖有趣的onCreate function中分配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 实现了这个 function

navView.setNavigationItemSelectedListener {}

我在这个 function 中编写了与您的代码相同的开关盒,现在它对我来说很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM