databinding

0 阅读1分钟

初始化 view

对于布局 test.xml 来说,它会生成 TestBinding 类,通过它的 inflate() 方法可以生成 xml 对应的 view。整个调用过程如下,最终到 TestBindingImpl 的构造函数中。

其中在 DataBindingUtil::inflate() 中会通过 LayoutInflater::inflate() 方法将对应的布局 id 转换成 view。

image.png

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 初始化部分结束