首页 > 解决方案 > 我们应该在 Kotlin Android 项目中使用黄油刀还是 findViewById(),因为我们可以通过 id 直接访问视图

问题描述

我可以通过在 Kotlin android 项目的布局 xml 文件中定义的 id 直接在活动内部访问我的布局视图(如按钮、TextView、EditText 等)。

那么,我们是否需要在 kotlin android 项目中使用 findviewbyId() 或黄油刀库?

学生活动.kt


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val studentViewModel = getStudentViewModel()

        updateButton.setOnClickListener {
            val name = nameEditText.text.toString()
            val age = ageEditText.text.toString()
            val subject = subjectEditText.text.toString()

                studentViewModel.updateStudentRecord(
                    Student(
                        name,
                        Integer.parseInt(age),
                        subject
                    )
                )

    }
}
}```

标签: androidkotlinbutterknife

解决方案


ButterKnife是视图绑定的旧解决方案。它的样板代码比旧findviewbyId方法少,但因为annotation processors它会影响构建时间速度并且不提供Null safetyand Type safety. 更好的解决方案是kotlinx.android.synthetic您在示例中使用,但它也有一些问题。例如,如果您将内容视图设置为布局,然后键入仅存在于不同布局中的 id,IDE 允许您自动完成并添加新的导入语句。除非开发人员专门检查以确保他们的导入语句只导入正确的视图,否则没有安全的方法来验证这不会导致运行时问题。由于一切都是全局的,因此必须小心确保他们只使用他们期望的视图并忽略自动完成。DataBindingViewBinding 是目前最好的解决方案。乍一看,它们很相似。两者都生成绑定类,您可以使用这些绑定类直接通过 supportNull safety和来引用视图Type safety,但有一些区别:

  • DataBinding方法需要您向<layout>XML 布局添加标签以启用数据绑定过程
  • ViewBinding不支持布局变量或布局表达式,因此不能用于将布局与 XML 中的数据绑定

ViewBindingDataBinding构建时间更快,因为它不使用注释处理器。


推荐阅读