作者在编写这本书第三版的时候还是 Android 10,但当我读到这本书手机上跑的已经是 Android 14 了,期间发生了很多技术上的变化。我把遇到的坑列出来,希望能给你提供一些参考。
第三章
3.2
kotlin-android-extensions 已被弃用,现在用 Jetpack view binding (3.2.4)
Android Developers 上这篇 Migrate from Kotlin synthetics to Jetpack view binding 指出 kotlin-android-extensions 已被弃用,应该用 Jetpack view binding。但我写到这里才发现我一直用的是 databinding 而不是 viewbinding。好在这俩差不多。
以下是将 findViewById() 换用为 View Binding 的方法
在 build.gradle.kts (Module :app) 中添加以下字段启用 View Binding
... android{ ... buildFeatures{ ... viewBinding = true } }
然后 Sync Project with Gradle Files 使其生效。我这里的快捷键是 Ctrl+Shift+O。
在 onCreate() 中添加如下代码 (假设 Activity 名为 MainActivity)
val binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root)
之后就可以用如下的代码为一个(id 为 button1)的 Button 绑定点击事件:
binding.button1.setOnClickListener { Log.d("MainActivity","button1 clicked") }
以下是将 findViewById() 换用为 Data Binding 的方法
在 build.gradle.kts (Module :app) 中添加以下字段启用Data Binding
... android{ ... buildFeatures{ ... dataBinding = true } }
然后 Sync Project with Gradle Files 使其生效。我这里的快捷键是 Ctrl+Shift+O。
将对应布局文件的类转换为 Data Binding Layout。方法为
右键类名(书中提到的LinearLayout。默认生成的是androidx.constraintlayout.widget.ConstraintLayout)
Show Context Actions
Convert to data binding layout
在 onCreate() 中添加如下代码 (假设 Activity 名为 MainActivity)
val binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root)
之后就可以用如下的代码为一个(id 为 button1)的 Button 绑定点击事件:
binding.button1.setOnClickListener { Log.d("MainActivity","button1 clicked") }
3.3
- 在 AndroidManifest 中注册 Activity,若想要用隐式 Intent 调用,需要设置 android:exported=“true” (3.3.2)
- (?)隐式Intent,匹配URI的方法无法实现(3.3.3)
- startActivityForResult 已被弃用,但仍然可以工作(3.3.5)
- onBackPressed 已被弃用,但仍然可以工作(3.3.5)