从 Kotlin synthetic 迁移到 View Binding

251 字
1 分钟
从 Kotlin synthetic 迁移到 View Binding

现象#

升级 Kotlin 或 Android Gradle Plugin 后,布局控件 ID 不能再作为 Kotlin 属性直接访问。旧文章常建议重新添加 kotlin-android-extensions,但该插件已经弃用,不应恢复。

快速结论#

启用 View Binding。它会为每个布局生成类型安全的绑定类,不需要运行时查找 View,也不会引入 synthetic 缓存带来的作用域问题。

启用 View Binding#

在应用模块的 build.gradle.kts 中添加:

android {
    buildFeatures {
        viewBinding = true
    }
}

Groovy DSL 对应写法:

android {
    buildFeatures {
        viewBinding true
    }
}

在 Activity 中使用#

假设布局名为 activity_main.xml,生成类为 ActivityMainBinding:

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.sendButton.setOnClickListener {
            binding.statusText.text = "已发送"
        }
    }
}

Fragment 中绑定对象只在 onCreateView() 到 onDestroyView() 之间有效,必须在销毁视图时清空,避免持有失效 View。

验证#

  1. 删除所有 synthetic import。
  2. 同步 Gradle 并重新构建。
  3. 搜索项目,确认不存在 kotlin-android-extensions 和 kotlinx.android.synthetic。

参考#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

从 Kotlin synthetic 迁移到 View Binding
https://blog.mintalix.com/posts/study-kotlin/
作者
Mint
发布于
2021-06-24
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Mint
软件开发、工程实践与技术思考。
分类
标签