首页 > 解决方案 > 使用 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

从我目前发现的情况来看:

但是这些都没有谈到使用绑定的 id 是否比使用 R.id 更好。. 我的猜测是使用 R.id。是首选,因为并非所有元素都必须是视图绑定的,因此,为了保持一致性,我可以在任何地方使用 R.id.*,因为我可能无法在属性不可访问的地方使用绑定。但正如我所说,这只是一个猜测,我想听听对此的更明智的意见。

标签: androidkotlinandroid-viewbinding

解决方案


您应该始终使用视图绑定。它比 更有效findViewById。每次调用findViewById()时,Android 系统都会在运行时遍历整个视图层次结构来查找视图。而 View Binding 只遍历视图层次结构一次。对于大型视图层次结构,使用findViewById会显着减慢用户的应用程序。

如果您将视图 ID 用于调用以外的任何操作findViewById(),则可以安全地R.id.view_id使用binding.view.id。两者具有相同的性能特征


推荐阅读