27
2017
09

DataBinding的基本使用

导包

在module的gradle中
android {
    ...
    //开启dataBinding
    dataBinding{
        enabled true
    }
}

获取控件

<?xml version="1.0" encoding="utf-8"?>
<!--布局以layout作为根布局-->
<layout>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="www.zhang.com.databinding.MainActivity">
        <TextView  android:gravity="center" android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test" />
    </LinearLayout>
</layout>
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通过DataBindingUtil的setContentView()将activity和布局绑定,返回binding对象
        binding=DataBindingUtil.setContentView(MainActivity.this,R.layout.activity_main);
        //binding对象中会自动持有控件作为属性
        binding.tv.setText("你妹啊");
    }

绑定控件和基本数据类型

<layout>
    <data>
        <!--name对应java中的类名 type对应java中的数据类型-->
        <variable  name="data1" type="String"/>
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="www.zhang.com.databinding.MainActivity">

        //使用@{data.name}控件和data绑定,支持运算符运算和静态方法调用和转换
        <TextView  android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@{data1}"/>
    </LinearLayout>
</layout>
    private ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通过DataBindingUtil的setContentView()将activity和布局绑定,返回binding对象
        binding=DataBindingUtil.setContentView(MainActivity.this,R.layout.activity_main);
        //通过binding对象的.setDataname()来设置data变量
        binding.setData1("绑定测试");
    }

将控件和Model绑定

保存数据的model
public class Model {
    String name;
    int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
<layout>
    <data>
        <variable  name="data1" type="String"/>

        <!--name对应java中的类名 type对应model的全路径名-->
        <variable name="model" type="com.junx.mvvmdatabinding.Model"/>
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="www.zhang.com.databinding.MainActivity">

        //使用@{data.name}控件和data绑定,支持运算符运算和静态方法调用和转换
        <TextView  android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@{model.name}"/>
    </LinearLayout>
</layout>
    private ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通过DataBindingUtil的setContentView()将activity和布局绑定,返回binding对象
        binding=DataBindingUtil.setContentView(MainActivity.this,R.layout.activity_main);
        //通过binding对象的.setDataname()来设置model
        Model model = new Model();
        model.setName("老将");
        binding.setModel(model);

        //也可以
        binding.setVariable(BR.model,model);
    }

将Button和事件绑定

定义接口
public interface Event {
    public void click(View view);
}
#在布局中定义接口,并和button和onclick绑定
<layout>
    <data>
        <variable name="event" type="com.junx.mvvmdatabinding.Event"/>
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="www.zhang.com.databinding.MainActivity">

        //在onclick中和event绑定
        <Button  android:onClick="@{event.click}" android:text="绑定事件" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    </LinearLayout>
</layout>
在代码中调用
    private ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通过DataBindingUtil的setContentView()将activity和布局绑定,返回binding对象
       binding=DataBindingUtil.setContentView(MainActivity.this,R.layout.activity_main);
       binding.setEvent(new Event() {
            @Override
            public void click(View v) {
                Toast.makeText(getApplicationContext(),"你愁啥",Toast.LENGTH_SHORT).show();
            });
    }

在布局中调用静态方法

public class Utils {
    //必须是静态 公开的,因为不是databinding不是通过反射
    public static String getStr(String str){
      return str;
    }
    public static String getStr(){
      return "默认";
    }
}
<layout>
    <data>
        <!--通过import将类导入-->
        <import type="com.junx.mvvmdatabinding.Utils"/>
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="www.zhang.com.databinding.MainActivity">
        <!--如果是无参方法,那么不传入参数即可-->
        <Button  android:onClick="@{event.click}" android:text="@{Utils.getStr(data1)}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    </LinearLayout>
</layout>

绑定model的控件自动更新 数据

//继承BaseObservable
public class AutoModel extends BaseObservable {
    private String name;

    //在需要自动更新的属性的getter方法上添加@Bindale注解
    @Bindable
    public String getName() {
        return name;
    }
    //在setter方法中通知更新
    public void setName(String name) {
        this.name = name;
        //在修改数据后通知bingding数据已经改变,只能获取到添加了@Bindable的属性,否则报错
        notifyPropertyChanged(BR.name);
        //notifyChange()该方法可以通知更新所有数据,不需要和@Bindable使用
    }
}
<layout>
    <data>
        <!--自动更新的model类-->
        <variable name="automodel" type="com.junx.mvvmdatabinding.AutoModel"/>
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="www.zhang.com.databinding.MainActivity">

        <TextView  android:id="@+id/tv2" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" //在这里绑定数据 android:text="@{automodel.name}"/>
    </LinearLayout>
</layout>
        //自动更新的model
        autoModel = new AutoModel();
        autoModel.setName("自动更新"+(x++));
        binding.setAutomodel(autoModel);

自动更新的数据类

Observable是一个接口,它的子类有BaseObservable,ObservableField,ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, and ObservableParcelableObservableArrayList,ObservableArrayMap
//其属性使用继承于BaseObservable的类,其子类实现了set get方法
public class AutoModel2 {
    /*BaseObservable,ObservableField,ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, and ObservableParcelable, ObservableArrayList,ObservableArrayMap*/
    public ObservableField<String> name = new ObservableField<>();
    public ObservableInt age = new ObservableInt();

}
<layout>
    <data>
        <!--自动更新的model类-->
        <variable name="automode2" type="com.junx.mvvmdatabinding.AutoModel2"/>
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="www.zhang.com.databinding.MainActivity">
        <TextView  android:id="@+id/tv3" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@{automode2.name}"/>
    </LinearLayout>
</layout>
        //自动更新的model2
        autoModel2=new AutoModel2();
        autoModel2.name.set("model2");
        binding.setAutomode2(autoModel2);
上一篇:阿里的开源框架_V-layout的使用 下一篇:Android DVB底层Linux驱动