JetPack之DataBinding的正确用法)
介绍
本篇文章主要用于讲述DataBinding中的一些坑,具体DataBinding的用法,详见官网
DataBinding之Fragment,RecylistView绑定无效问题
在Activity中,我们往往是使用setContentView方法,来获取binding,用法很简单,代码如下,第一个参数this传入了当前Activity,第二个参数传入了布局。
binding=DataBindingUtil.setContentView(this,R.layout.activity_second);
如此我们轻易的获取了对应的binding,可以愉快的在binding修改值,从而改变显示的View。
而在Fragment,RecylistView显然是无法使用setContentView的,而是通过inflate方法获取databing,官方介绍代码如下
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
我们可以通过该方法得databing,然而此处官方代码却是缺失了在Fragment,RecylistView具体使用部分,在Fragment的onCreateView
我们需要获取对应的View,一般我们很容易写下错误的代码,dataBinding
和view
并不绑定,错误代码如下:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var view=inflater.inflate(R.layout.fragment_test,null)
var binding=DataBindingUtil.inflate<FragmentTestBinding>(inflater,R.layout.fragment_test,null,false)
return view
}
在这段代码中,我们最终会发现,布局根本没有绑定。其实这也很好理解,我们从代码中可以看出,我们的View压根就没与binding产生任何的关联。正确的代码应该如下:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val binding: FragmentTestBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, null, false)
val view: View = binding.root
return view
}
我们可以从binding中获取对应的root,该root显然是一个与binding有关联的view,传递给fragmet。
除了使用inflate,DataBindingUtil还提供了另一个bind(view:View)
方法来让我们绑定已知类型的DataBinding。代码如下:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var view=inflater.inflate(R.layout.fragment_test,null)
var binding=DataBindingUtil.bind<FragmentTestBinding>(view)
return view
}
不过相对于inflate,bind要求指定返回的DataBinding的具体类。