无法在Kotlin中为元素设置OnClickListener的问题求助
你遇到的这个问题,核心原因是Kotlin Android Extensions(也就是之前让你直接用XML ID访问控件的特性)已经被官方弃用,在你使用的Android Studio 4稳定版中,这个特性默认不再启用了。下面给你两种解决方案,优先推荐官方现在主推的View Binding方案:
方案一:启用View Binding(推荐)
View Binding是官方替代Kotlin Android Extensions的方案,它类型安全、编译时检查错误,性能也更可靠。
1. 在模块级build.gradle中启用View Binding
打开你的app目录下的build.gradle(注意是模块级,不是项目根目录的配置文件),在android代码块里添加View Binding的配置:
android { ... buildFeatures { viewBinding true } }
添加完成后,点击Android Studio右上角的「Sync Now」按钮同步Gradle项目。
2. 修改MainActivity代码使用View Binding
更新你的MainActivity.kt,通过View Binding来获取和操作界面控件:
package com.example.myapplication import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.example.myapplication.databinding.ActivityMainBinding // 自动生成的Binding类 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import retrofit2.Retrofit import retrofit2.awaitResponse const val BASE_URL = "https://cat-fact.herokuapp.com/" class MainActivity : AppCompatActivity() { private var TAG = "MainActivity" private lateinit var binding: ActivityMainBinding // 声明Binding对象 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化Binding,替代原有的setContentView binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 通过binding对象访问按钮,设置点击事件 binding.genNewFact.setOnClickListener { getCurrentData() } // 首次进入页面自动加载一次数据 getCurrentData() } private fun getCurrentData() { val api = Retrofit.Builder() .baseUrl(BASE_URL) .build() .create(ApiRequests::class.java) GlobalScope.launch(Dispatchers.IO) { val response = api.getFacts().awaitResponse() if (response.isSuccessful) { val data = response.body()!! Log.d(TAG, data.text) withContext(Dispatchers.Main) { // 更新TextView的内容 binding.textView.text = data.text } } } } }
这里的ActivityMainBinding是系统根据你的activity_main.xml自动生成的类,所有XML里的控件ID都会被转换成驼峰命名格式(比如gen_new_fact变成genNewFact)。
方案二:临时启用Kotlin Android Extensions(不推荐)
如果你只是想临时回到之前的写法,可以手动启用这个已被弃用的插件,但注意它未来会被彻底移除:
1. 在模块级build.gradle中添加插件
plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' // 添加这个插件 }
2. 在Activity中导入控件的合成引用
在MainActivity.kt的顶部添加导入语句:
import kotlinx.android.synthetic.main.activity_main.*
这样你就可以像之前一样直接用gen_new_fact.setOnClickListener { ... }来操作控件了,但还是建议尽快迁移到View Binding,避免后续版本兼容问题。
另外我在View Binding的示例代码里,帮你补充了按钮点击触发刷新数据的逻辑,同时把获取到的猫事实更新到了TextView中,让你的功能更完整。
内容的提问来源于stack exchange,提问作者mikayelgrigoryan

