Kotlin使用BottomNavigationView时bottom_navigation与it报错求助
报错原因
你代码里几处语法和使用错误直接导致了bottom_navigation、it两个标识无法被编译器识别:
- ViewBinding未正确初始化:仅声明了
binding变量却没有执行inflate操作,直接调用setContentView(binding.root)本身就会触发未初始化崩溃,也无法通过binding对象访问布局控件。 - 控件引用方式错误:当前版本的Kotlin已经废弃了直接通过xml id访问控件的kotlin-android-extensions插件,直接写裸的
bottom_navigation编译器找不到对应变量,需要通过ViewBinding生成的属性访问,且xml中下划线命名的id会被转成驼峰,bottom_navigation对应的属性是binding.bottomNavigation。 - 监听器语法错误:
setOnNavigationItemSelectedListener需要将点击处理逻辑作为lambda参数传入方法,你把when判断写在了方法调用外部,it是lambda的隐式参数,脱离lambda作用域自然无法识别。 - 监听器缺少必要返回值:该方法要求返回布尔值标记是否消费本次点击事件,原代码没有返回值也会触发语法报错。
- 布局文件顺序问题:FrameLayout在BottomNavigationView之前定义,却通过
layout_above引用后者id,部分编译环境下会报id找不到错误。 - 文件后缀错误:你的Kotlin文件命名为
Main Activity.ktl,Kotlin正确文件后缀为.kt,后缀错误会导致编译器不识别源码。
修复后代码
MainActivity.kt
package com.example.myapplication import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.fragment.app.Fragment import com.example.myapplication.Fragments.* import com.example.myapplication.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化ViewBinding binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val homeFragment = HomeFragment() val videoFragment = VideoFragment() val upcomingFragment = UpcomingFragment() val podcastFragment = PodcastFragment() val communityFragment = CommunityFragment() makeCurrentFragment(homeFragment) // 正确绑定底部导航监听器 binding.bottomNavigation.setOnNavigationItemSelectedListener { when(it.itemId){ R.id.ic_home_icon_white -> makeCurrentFragment(homeFragment) R.id.ic_video_white -> makeCurrentFragment(videoFragment) R.id.ic_upcoming_icon -> makeCurrentFragment(upcomingFragment) R.id.ic_podcast_white -> makeCurrentFragment(podcastFragment) R.id.ic_community_white-> makeCurrentFragment(communityFragment) } // 返回true标记事件已消费 true } } private fun makeCurrentFragment(fragment: Fragment) = supportFragmentManager.beginTransaction().apply { replace(R.id.fl_wrapper, fragment) commit() } }
activity_main.xml
<RelativeLayout 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:layout_width="match_parent" android:layout_height="match_parent" android:background="#1E1E1E" tools:context=".MainActivity"> <!-- 先定义底部导航,避免后续控件引用id报错 --> <com.google.android.material.bottomnavigation.BottomNavigationView android:id = "@+id/bottom_navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="?android:attr/windowBackground" app:itemBackground="@color/design_default_color_primary" app:itemIconTint="#fff" app:itemTextColor="#fff" app:menu="@menu/my_nav" /> <FrameLayout android:id = "@+id/fl_wrapper" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/bottom_navigation"/> </RelativeLayout>
前置配置检查
如果替换代码后仍有报错,确认模块级build.gradle中已做如下配置:
- 开启ViewBinding:
android { // 其他现有配置 buildFeatures { viewBinding true } }
- 引入Material组件依赖:
dependencies { // 其他现有依赖 implementation 'com.google.android.material:material:1.9.0' }
内容的提问来源于stack exchange,提问作者DishonestDemon
相关产品推荐
相关产品推荐

