初始化 view
对于布局 test.xml 来说,它会生成 TestBinding 类,通过它的 inflate() 方法可以生成 xml 对应的 view。整个调用过程如下,最终到 TestBindingImpl 的构造函数中。
其中在 DataBindingUtil::inflate() 中会通过 LayoutInflater::inflate() 方法将对应的布局 id 转换成 view。
TestBindingImpl::init 方法如下
static {
sIncludes = null;
sViewsWithIds = new android.util.SparseIntArray();
// 存储每一个 id 与一个数字
sViewsWithIds.put(R.id.tv, 1);
sViewsWithIds.put(R.id.tv2, 2);
}
// 这里的 root 就是 xml 布局生成的 view
public TestBindingImpl(@Nullable androidx.databinding.DataBindingComponent bindingComponent, @NonNull View root) {
// 调用 mapBindings,这里面就会返回一个 object[]
// 存储的就是各个 view,第 0 个表示根 view
// 其余各元素按照 sViewsWithIds 中对应的 value 依次存入
this(bindingComponent, root, mapBindings(bindingComponent, root, 3, sIncludes, sViewsWithIds));
}
各 id 对应的 view 拿到后,会通过构造函数形式传递给 TestBinding,由 TestBinding 存储到各字段中(这些字段就是根据 id 生成的各 view 对应的)
至此,databinding 中 view 初始化部分结束