android - 我们应该在 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
)
)
}
}
}```
解决方案
ButterKnife
是视图绑定的旧解决方案。它的样板代码比旧findviewbyId
方法少,但因为annotation processors
它会影响构建时间速度并且不提供Null safety
and Type safety
. 更好的解决方案是kotlinx.android.synthetic
您在示例中使用,但它也有一些问题。例如,如果您将内容视图设置为布局,然后键入仅存在于不同布局中的 id,IDE 允许您自动完成并添加新的导入语句。除非开发人员专门检查以确保他们的导入语句只导入正确的视图,否则没有安全的方法来验证这不会导致运行时问题。由于一切都是全局的,因此必须小心确保他们只使用他们期望的视图并忽略自动完成。DataBinding
和ViewBinding
是目前最好的解决方案。乍一看,它们很相似。两者都生成绑定类,您可以使用这些绑定类直接通过 supportNull safety
和来引用视图Type safety
,但有一些区别:
DataBinding
方法需要您向<layout>
XML 布局添加标签以启用数据绑定过程ViewBinding
不支持布局变量或布局表达式,因此不能用于将布局与 XML 中的数据绑定
ViewBinding
比DataBinding
构建时间更快,因为它不使用注释处理器。
推荐阅读
- angular - !: Angular 中的(爆炸冒号)符号
- c - 如何在 C 中打印 wchar_t 变量
- node.js - 如何在 Node.js 中从 Google Cloud Functions 调用 Oracle DB
- python - 如何更改 Celery beat 服务的默认路径?
- virtual-machine - 尝试在 Hyper-V 中安装操作系统时,它会忽略引导顺序并立即转到“通过 IPv4 启动 PXE”
- multithreading - 多维数组处理的 DirectCompute 多线程性能(线程和线程组)
- jquery - 如何在前端使用 reCaptcha V3 和 jQuery?
- python - Python:为什么ffectfinder模块在cmd窗口中不起作用?
- python - 如何获取所有 subreddits PRAW/PSAW
- java - 在实现接口的函数之间共享变量