作者在编写这本书第三版的时候还是 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 的方法
  1. 在 build.gradle.kts (Module :app) 中添加以下字段启用 View Binding

    ... 
    android{
    ...
        buildFeatures{
    ...
            viewBinding = true
        }
    }
    

    然后 Sync Project with Gradle Files 使其生效。我这里的快捷键是 Ctrl+Shift+O。

  2. 在 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 的方法
  1. 在 build.gradle.kts (Module :app) 中添加以下字段启用Data Binding

    ... 
    android{
    ...
        buildFeatures{
    ...
            dataBinding = true
        }
    }
    

    然后 Sync Project with Gradle Files 使其生效。我这里的快捷键是 Ctrl+Shift+O。

  2. 将对应布局文件的类转换为 Data Binding Layout。方法为

    1. 右键类名(书中提到的LinearLayout。默认生成的是androidx.constraintlayout.widget.ConstraintLayout)

    2. Show Context Actions

    3. Convert to data binding layout

  3. 在 onCreate() 中添加如下代码 (假设 Activity 名为 MainActivity)

    val binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    

    之后就可以用如下的代码为一个(id 为 button1)的 Button 绑定点击事件:

    binding.button1.setOnClickListener {
                Log.d("MainActivity","button1 clicked")
            }
    

3.3

  1. 在 AndroidManifest 中注册 Activity,若想要用隐式 Intent 调用,需要设置 android:exported=“true” (3.3.2)
  2. (?)隐式Intent,匹配URI的方法无法实现(3.3.3)
  3. startActivityForResult 已被弃用,但仍然可以工作(3.3.5)
  4. onBackPressed 已被弃用,但仍然可以工作(3.3.5)