NavigationView 点击事件不起作用

本文介绍了在Android开发中遇到NavigationView点击事件失效的问题,通过代码分析和调整,发现是格式化代码导致视图位置错误,修复后事件处理恢复正常。同时提醒开发者谨慎使用代码格式化快捷键,以防类似问题发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 出现问题

写了一个NavigationView导航的demo,但是监听不到itemhead的点击事件。
主要代码如下:
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. 小提示

最后再提醒一遍慎用格式化代码的快捷键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值