Data Binding 的使用

2018-08-06  本文已影响0人  falcon_li

官网使用说明

自己写的学习Android Jetpack 的开源项目

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 中的 版本号保持一致

上一篇下一篇

猜你喜欢

热点阅读