使用 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

根据我目前的发现:

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

您应该始终使用视图绑定。它比 findViewById 更有效。每次调用findViewById()时,Android系统会在运行时遍历整个视图层次结构来查找视图。而视图绑定仅遍历视图层次结构一次。对于大型视图层次结构,使用 findViewById 会明显降低用户的应用速度。

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