一: 在activity里
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
=
binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root)
二:在RecyclerView的onCreateViewHolder里,不能使用:
val binding = RecyclerViewItemBinding.inflate(layoutInflater)it didn't work
要使用:
val binding = DataBindingUtil.inflate<RecyclerViewItemBinding>(
layoutInflater,
R.layout.recycler_view_item,
parent,
false
)
设置databinding的一般步骤:
- 添加依赖:
plugins { ... id "kotlin-kapt" } android{ ... dataBinding { enabled = true } }
- 创建想使用数据绑定的布局:
<layout xmlns:android="http://schemas.android.com/apk/res/android"----------布局的最外面为layout标签, xmlns:tools="http://schemas.android.com/tools"> <data>--------里面有个data标签 <variable--------------要有个variable标签 name="viewModel"----------使用的名字,第四步用到!!!! type="com.example.beatbox.SoundViewModel" />-----------引用第三步会实现的kotlin类 </data> <Button android:layout_width="match_parent" android:layout_height="120dp" android:text="@{viewModel.title}"-----------可以使用viewmodel里的数据了,不用再在fragment或activity里指定 android:onClick="@{()->viewModel.onButtonClick()}"--------------可以有lambda表达式 tools:text="button"/> </layout>
- 创建kotlin的viewmodel
class SoundViewModel{ var sound:Sound? = null set(sound) { field = sound } val title:String? get() = sound?.name fun onButtonClick(){ Log.d("SoundViewModel", "shit") } }
- 在activity或fragment加载出布局的时候,使用返回的binding:
binding.viewModel = SoundViewModel()//viewmodel填在第二步中指定的名字
- 然后我们只要设置了binding的属性,布局就会跟着变化,数据绑定就是这么个回事。