1. 出现问题
写了一个NavigationView
导航的demo,但是监听不到item
和head
的点击事件。
主要代码如下:
activity_main.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">
<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_main"
app:menu="@menu/activity_main_drawer" />
<include
android:id="@+id/app_bar_main"
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.drawerlayout.widget.DrawerLayout>
MainActivity.kt
override fun initView() {
setSupportActionBar(binding.appBarMain.toolbar)
binding.appBarMain.fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
val drawerLayout: DrawerLayout = binding.drawerLayout
val navView = binding.navView
val navController = findNavController(R.id.nav_host_fragment_content_main)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
appBarConfiguration = AppBarConfiguration(setOf(
R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow), drawerLayout)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
navView.getHeaderView(0).setOnClickListener {
Log.i("TAG", "getHeaderView: =${it}")
}
navView.setNavigationItemSelectedListener(object :NavigationView.OnNavigationItemSelectedListener{
override fun onNavigationItemSelected(item: MenuItem): Boolean {
Log.i("TAG", "onNavigationItemSelected:=${item.title}")
return true
}
})
}
2. 解决问题
折腾一番后发现其实是自己的一个习惯害了自己,activity_main.xml
写好后,习惯性的option+command+L
格式化代码快捷键,导致DrawerLayou
里面的两个view互换位置,修改为如下之后,一切正常。
<androidx.drawerlayout.widget.DrawerLayout>
<include/>
<com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
3. 问题可能的原因
仔细想想其实如果写成下面这样
<androidx.drawerlayout.widget.DrawerLayout>
<com.google.android.material.navigation.NavigationView>
<include/>
</androidx.drawerlayout.widget.DrawerLayout>```
NavigationView
是获取不到焦点的,因为DrawerLayout
继承自ViewGoup
,从布局上来看有点类似FrameLayout
,<include/>
覆盖在NavigationView
上面,所以下面的的View
获取不到焦点。
4. 小提示
最后再提醒一遍慎用格式化代码的快捷键