databinding是google去年发布的一个库,它支持在xml中写表达式使得viewModel中的数据能够绑定到view中,目前已经支持双向绑定,也就是说数据的改变能够反馈到界面上,界面的数据也能够主动传到viewModel中。虽然我已经用这个库已经有4个月了,但是它的内在机制我一直没有去探寻,所以本片博客就是来深究databinding的运行机制。
1.了解 DataBindingUtil和DataBinderMapper
这是一个工具类主要就是帮助我们获取和生成View所对应的ViewDataBinding类。其中的方法分为以下几个种类
- 1.inflate(LayoutInflater inflater, int layoutId,ViewGroup parent, boolean attachToParent)
这个方法是将布局转化成一个ViewDataBinding,inflater和layoutId就不用说了。attachToParent表示是否将layoutId生成的View放入parent中。 - 2.bind(View root)
若我们已经得到了一个view并且其是由有databinding的xml文件生成的,那么我们就可以通过这个方法来获得ViewDataBinding,相当于上面一个方法的简化版。 - 3.findBinding(View view)
若一个view是一个使用过databinding的view的子view,那么我们就可以通过这个函数来寻找到其父view的ViewDataBinding。大家进入源代码中查看会发现,其内部只不过是通过while来不断的遍历当前view的父view来判断该父view是否绑定了ViewDataBinding。注意这个和前面的两个不同,这个方法的ViewDataBinding已经生成,本方法只不过是去找寻找而已 - 4.getBinding(View view)
这个方法和3一样也是去寻找已经生成的ViewDataBinding,不过这里的view就是已经使用过databing的view。 - 5.setContentView(Activity activity, int layoutId)
这个方法是将一个使用了databinding的view绑定到一个activity中去。其源码也很简单,先调用了该activity的setContentView(layoutId)。然后获取activity的decorView中的bodyView(我想了解activity绘制机制的同学应该了解这东西),将其作为该view的parent view。最终调用前面的bind()方法生成ViewDataBinding。 - 6.getDataBinder(DataBindingComponent bindingComponent, View view, int layoutId)
这个方法在自动生成的DataBinderMapper中,前面DataBindingUtil需要生成ViewDataBinding的方法最终都是调用了这个方法。这个方法通过layoutId找到需要生成的具体的ViewDataBinding类,然后调用ViewDataBinding的bind(view, bind