使用 Jetpack 视图绑定时,我应该继续通过 R.id.something 引用 ID,还是改用 binding.something.id?
When using Jetpack view binding, should I keep referring to ids through R.id.something, or use binding.something.id instead?
我想在我的一个布局 xml 中检索布局的 ID,并且可以同时使用两者
R.id.* 以及对此的绑定 - 详情如下。
哪个是首选方式?
给定以下结构:
app
|-- java.org.romco.appname
| |-- MainActivity.kt
|-- res.layout
| |-- main_activity.xml
| |-- main_content.xml
假设我的 main_activity.xml 是一个 CoordinatorLayout 并且包括 main_content.xml 定义的 id 为“main_content”,例如:
android:id="@+id/main_content"
layout="@layout/content_main" />
我的 content_main.xml 然后包含一个 FrameLayout,其定义的 if 为“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, binding id = 2131231072
根据我目前的发现:
这是一个介绍视图绑定的视频,但他们只是提到它是为了避免使用 findViewById:https://www.youtube.com/watch?v=td3Kd7fOROw&t=1756s
本文向我们介绍了在 Activity 和 Fragment 中使用视图绑定,但同样,这似乎只是作为一种避免 findViewById 的方法。 https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
官方文档的内容与文章几乎相同:https://developer.android.com/topic/libraries/view-binding
但是其中 none 谈论使用绑定 id 是否比使用 R.id. 更好。
我的猜测是使用 R.id. 是首选,因为并非所有元素都必须是视图绑定的,因此,为了保持一致性,我可以在任何地方使用 R.id.*,我可能无法在无法访问 属性 的地方使用绑定。但正如我所说,这只是一个猜测,我想听听更明智的意见。
您应该始终使用视图绑定。它比 findViewById
更有效。每次调用findViewById()
时,Android系统会在运行时遍历整个视图层次结构来查找视图。而视图绑定仅遍历视图层次结构一次。对于大型视图层次结构,使用 findViewById
会明显降低用户的应用速度。
如果您将视图 ID 用于调用 findViewById()
以外的任何其他用途,则可以安全地使用 R.id.view_id
而不是 binding.view.id
。两者具有相同的性能特征
我想在我的一个布局 xml 中检索布局的 ID,并且可以同时使用两者 R.id.* 以及对此的绑定 - 详情如下。 哪个是首选方式?
给定以下结构:
app
|-- java.org.romco.appname
| |-- MainActivity.kt
|-- res.layout
| |-- main_activity.xml
| |-- main_content.xml
假设我的 main_activity.xml 是一个 CoordinatorLayout 并且包括 main_content.xml 定义的 id 为“main_content”,例如:
android:id="@+id/main_content"
layout="@layout/content_main" />
我的 content_main.xml 然后包含一个 FrameLayout,其定义的 if 为“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, binding id = 2131231072
根据我目前的发现:
这是一个介绍视图绑定的视频,但他们只是提到它是为了避免使用 findViewById:https://www.youtube.com/watch?v=td3Kd7fOROw&t=1756s
本文向我们介绍了在 Activity 和 Fragment 中使用视图绑定,但同样,这似乎只是作为一种避免 findViewById 的方法。 https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
官方文档的内容与文章几乎相同:https://developer.android.com/topic/libraries/view-binding
但是其中 none 谈论使用绑定 id 是否比使用 R.id. 更好。 我的猜测是使用 R.id. 是首选,因为并非所有元素都必须是视图绑定的,因此,为了保持一致性,我可以在任何地方使用 R.id.*,我可能无法在无法访问 属性 的地方使用绑定。但正如我所说,这只是一个猜测,我想听听更明智的意见。
您应该始终使用视图绑定。它比 findViewById
更有效。每次调用findViewById()
时,Android系统会在运行时遍历整个视图层次结构来查找视图。而视图绑定仅遍历视图层次结构一次。对于大型视图层次结构,使用 findViewById
会明显降低用户的应用速度。
如果您将视图 ID 用于调用 findViewById()
以外的任何其他用途,则可以安全地使用 R.id.view_id
而不是 binding.view.id
。两者具有相同的性能特征