You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin使用BottomNavigationView时bottom_navigation与it报错求助

报错原因

你代码里几处语法和使用错误直接导致了bottom_navigation、it两个标识无法被编译器识别:

  1. ViewBinding未正确初始化:仅声明了binding变量却没有执行inflate操作,直接调用setContentView(binding.root)本身就会触发未初始化崩溃,也无法通过binding对象访问布局控件。
  2. 控件引用方式错误:当前版本的Kotlin已经废弃了直接通过xml id访问控件的kotlin-android-extensions插件,直接写裸的bottom_navigation编译器找不到对应变量,需要通过ViewBinding生成的属性访问,且xml中下划线命名的id会被转成驼峰,bottom_navigation对应的属性是binding.bottomNavigation。
  3. 监听器语法错误:setOnNavigationItemSelectedListener需要将点击处理逻辑作为lambda参数传入方法,你把when判断写在了方法调用外部,it是lambda的隐式参数,脱离lambda作用域自然无法识别。
  4. 监听器缺少必要返回值:该方法要求返回布尔值标记是否消费本次点击事件,原代码没有返回值也会触发语法报错。
  5. 布局文件顺序问题:FrameLayout在BottomNavigationView之前定义,却通过layout_above引用后者id,部分编译环境下会报id找不到错误。
  6. 文件后缀错误:你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:57:23