书籍
《第一行代码 Android》第三版
开发环境
Android Studio Jellyfish | 2023.3.1
问题
在学习《第一行代码 Android》第三版的3.3.5 返回数据给上一个Activity章节时, 在SecondActivity中给按钮注册点击事件时出现问题"Unresolved reference: button2",如下图所示:
分析
这个问题很明显就是在SecondActivity.kt中无法正确引用second_layout.xml中定义的控件button2.原因是在此处作者引用控件的方式是直接xml控件ID直接引用的方式,要实现这种方式需要引入插件"kotlin-android-extensions",而目前这个插件已经被淘汰了,使用ViewBinging替代.
解决方法
使用ViewBinging来引用控件,细节可以参考本人前面写的文章ViewBinding的使用(因为kotlin-android-extensions插件的淘汰)_kotlin viewbinding 过时-CSDN博客
package com.example.activitytestimport android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.activitytest.databinding.SecondLayoutBinding
class SecondActivity : AppCompatActivity() {private lateinit var secondBinding: SecondLayoutBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)
// enableEdgeToEdge()setContentView(R.layout.second_layout)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}secondBinding = SecondLayoutBinding.inflate(layoutInflater)setContentView(secondBinding.root)secondBinding.button2.setOnClickListener{Log.d("button2", "setOnClickListener")val intent = Intent()intent.putExtra("data_return", "setOnClickListener")setResult(RESULT_OK, intent)Log.d("SecondActivity", "SecondActivity return back to FirstActivity")finish()}}override fun onBackPressed() {val intent = Intent()intent.putExtra("data_return", "onBackPressed")setResult(RESULT_OK, intent)finish()}
}
题外话
原本刚出现该问题的时候就是采用了ViewBingding的方式去解决该问题,但是因为粗心少写了一句代码setContentView(secondBinding.root)导致在点击button2的时候完全没有反应,幸好后面又重新试了一次.再次感叹,写代码,就是要细心才行啊.