在使用 ViewBinding 时,我遇到了一些未记录的案例。
第一:如何获得包含的通用视图布局部分的绑定,主绑定只看到主布局中的项目?
第二:如何获得包含的合并类型布局部分的绑定,再次主绑定只看到主布局中的项目?
的情况下:
包含通用布局(不是合并节点),我们需要为包含的部分分配 ID,这样在绑定中我们将可以访问包含的子部分
这种方式在您的活动代码中:
private lateinit var exampleBinding: ActivityExampleBinding //activity_example.xml layout override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) exampleBinding = ActivityExampleBinding.inflate(layoutInflater) setContentView(exampleBinding.root) //we will be able to access included layouts view like this val includedView: View = exampleBinding.yourId.idOfIncludedView //[...] }
在外部布局中包含合并块。我们无法为其添加 ID,因为合并块不是视图。假设我们有这样的永恒合并布局(merge_layout.xm):
<?xml version=”1.0” encoding=”utf-8”?> xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:showIn="@layout/activity_example">
<TextView android:id="@+id/some_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World" />
要正确绑定这样的合并布局,我们需要:
在您的活动代码中:
private lateinit var exampleBinding: ActivityExampleBinding //activity_example.xml layout private lateinit var mergeBinding: MergeLayoutBinding //merge_layout.xml layout override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) exampleBinding = ActivityExampleBinding.inflate(layoutInflater) //we need to bind the root layout with our binder for external layout mergeBinding = MergeLayoutBinding.bind(exampleBinding.root) setContentView(exampleBinding.root) //we will be able to access included in merge layout views like this val mergedView: View = mergeBinding.someView //[...] }