Data Binding 的使用
1.在根目录下的 build.gradle 中,添加
android { ...
dataBinding { enabled = true }
}
2. 在 xml 文件的最外层,使用 <layout> ...</layout> 标签(可以使用 alt + enter 的快捷键,选择 convert to data binding layout) , 在 <variable></variable> 标签中,定义需要使用到的对象,如
<variable>
name= "user"
type="com.example.User"/>
另外,还可以使用 <import ... /> 标签,引用需要使用的类,
如:
<import
type=""android.view.View.OnClickListener""
/>
<variable
name="click"
type="OnClickListener"
/>
3.在使用时,使用 @{} 设置值,如
<TextView
android:layout_width=".."
android:layout_height = ".."
android:text="@{user.name}"
android:onClick="@{click}"
/>
此外,android:onClick = '' @{...}'' 中,还可以传入 lambda 表达式
4.在 Activity 或者 Fragment 中,设置引用的类。
在 xml 中设置好后,在 Android Studio 的 Build -> Rebuild Project 后,自动生成 xml 文件对应的 DataBinding 类,生成的类与 xml 文件衔接,如 main_activity.xml 生成
MainActivityDataBinding。
使用
Activity 中
var mainAdb:MainActivityDataBinding = DataBindingUtil.setContentView(...);
Fragment 中
var mainFdb = DataBingdingUtils<MainFragmentDatabinding>.inflate(...);
Adapter 中的 DataBinding 对象与 item 的 xml 文件名对应,如
item_user.xml 生成 ItemUserDataBinding,在 onCreateViewHolder() 中,使用 ItemUserDataBinding.inflate 生成 view
5.设置 xml 中的对象引用
mainActivityDataBinding.user = User("name","age")//kotlin
mainActivityDataBinding.user = new User("name","age") // java
6.关于 object 对象的 binding
如果只使用到其中的某个或者多个属性,可以使用 ObservanleFeild<T> 属性,
class User{
val name:ObservableFeild<String> = ObservableFeild<string>()
}
当 user.name 发生变化, TextView 的 text 自动发生变化
也可以继承 BaseObservable 对象,进行绑定
class User : BaseObservable() {
var firstName: String? = null
@Bindable get() = field
set(firstName) {
field = firstName
notifyPropertyChanged(BR.firstName)
}
var lastName: String? = null
@Bindable get() = field
set(lastName) {
field = lastName
notifyPropertyChanged(BR.lastName)
}
}
7.设置自定义属性,使用@BindingAdapter("setUrl") 注解
<ImageView
android:layout_width=".."
android:layout_height = ".."
app:setUrl="..."
/>
Kotlin中使用 创建 .kt 文件
注意:
1.不是创建 Kotlin 的 class,而是 .kt 文件中
2.需要引入包 implementation 'androidx.core:core-ktx:xxxx_version'
@BindingAdapter("image_url")
fun setImageFromUrl(view: ImageView, imageUrl: String?) {
if (!imageUrl.isNullOrEmpty()) {
GlideUtil.setImage(view.context, imageUrl, view)
}
}
Java 中使用,则在 public 静态方法中添加注解即可
public class MyBindingAdapter {
@BindingAdapter("loadImageFromUrl")
public static void loadImage(ImageView view, String url) {
if (!url.isEmpty()) {
Glide.with(view.getContext()).load(url).into(view);
}
}
...
}
8.使用 LiveData ,自动管理生命周期
将 User 继承 ViewModel ,更多使用在 LiveData 中说明。
9.bug,can not resolve data ding
> 在 module 的 build.gradle 中添加 apply plugin:'kotlin-kapt'
```
dependencies {
...
kapt 'com.android.databinding:compiler:3.0.1'
}
```
其中的 *3.0.1* 与 Project 的 build.gradle 中的 版本号保持一致