android - 使用 Jetpack 视图绑定时,我应该继续通过 R.id.something 引用 id,还是改用 binding.something.id?
问题描述
我想在我的一个布局 xml 中检索 Layout 的 id,并且可以同时使用 R.id.* 和绑定 - 详情如下。哪个是首选方式?
给定以下结构:
app
|-- java.org.romco.appname
| |-- MainActivity.kt
|-- res.layout
| |-- main_activity.xml
| |-- main_content.xml
假设我的 main_activity.xml 是 CoordinatorLayout 并包含定义为“main_content”的 id 的 main_content.xml,例如:
android:id="@+id/main_content"
layout="@layout/content_main" />
然后我的 content_main.xml 包含一个 FrameLayout,其中定义了“task_details_container”,例如:
<FrameLayout
android:id="@+id/task_details_container" />
按照官方指南,MainActivity.kt 中的绑定将创建为:
class MainActivity : AppCompatActivity() {
private lateinit var mainActivityBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainActivityBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(mainActivityBinding.root)
}
如果我现在想引用 content_main.xml 中的 FrameView,我该怎么做?我应该使用我通常使用的东西,所以 R.id.task_details_container,还是更喜欢使用绑定来检索 ID,因为我有它可用?如果我尝试在 onCreate 中登录,输出是相同的:
val id1 = R.id.task_details_container
val id2 = mainActivityBinding.mainContent.taskDetailsContainer.id
Log.d("MainActivity", "R id = $id1, binding id = $id2")
日志输出:
D/MainActivity:R id = 2131231072,绑定id = 2131231072
从我目前发现的情况来看:
这是他们介绍视图绑定的视频,但他们只提到它是为了避免使用 findViewById:https ://www.youtube.com/watch?v=td3Kd7fOROw&t=1756s
本文将引导我们在活动和片段中使用视图绑定,但同样,这似乎只是作为避免 findViewById 的一种方式。https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
官方文档的内容与文章几乎相同:https ://developer.android.com/topic/libraries/view-binding
但是这些都没有谈到使用绑定的 id 是否比使用 R.id 更好。. 我的猜测是使用 R.id。是首选,因为并非所有元素都必须是视图绑定的,因此,为了保持一致性,我可以在任何地方使用 R.id.*,因为我可能无法在属性不可访问的地方使用绑定。但正如我所说,这只是一个猜测,我想听听对此的更明智的意见。
解决方案
您应该始终使用视图绑定。它比 更有效findViewById
。每次调用findViewById()
时,Android 系统都会在运行时遍历整个视图层次结构来查找视图。而 View Binding 只遍历视图层次结构一次。对于大型视图层次结构,使用findViewById
会显着减慢用户的应用程序。
如果您将视图 ID 用于调用以外的任何操作findViewById()
,则可以安全地R.id.view_id
使用binding.view.id
。两者具有相同的性能特征
推荐阅读
- sql - SQL 查找 10 月促销商店销售额最高的一天
- dictionary - Flutter & Cloud_Firestore。将文档转换为地图
- selenium - Selenium 4 中相对定位器的实时用例是什么?
- selenium - 如何在硒中将xpath更改为css
- java - 连接 USB 时,保存在 Android 内部存储中的文件在 PC 上不显示
- ssl - 启用 raft 模式时 TLS 握手失败
- angular - 从构建项目Angular的文件中读取参数
- android - 编辑文本掩码字符和数字android studio
- command-line - 如何忽略 7-zip 命令行警告并继续?
- docker - docker 容器会即时获取代码更改吗?