DataBinding(数据绑定)基础讲解

一.基础使用

1.Gradle依赖

android {
    compileSdkVersion 28

    defaultConfig {
        applicationId "com.wjn.okhttpmvpdemo"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }


    dataBinding {
        enabled = true
    }
}

即 添加

dataBinding {
    enabled = true
}

2.代码说明

实体类

package com.wjn.okhttpmvpdemo.databinding;

public class Student {

    private String name;
    private String age;
    private String sex;


    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}

布局文件




    

        
    

    

        

        
    

说明

<1> 关于布局文件名

布局文件名很重要,因为它关乎自动生成的Binding java类名。

比如布局文件名为:activity_data_binding  则自动生成的java类为:ActivityDataBindingBinding

比如布局文件名为:activity_user_list  则自动生成的java类为:ActivityUserListBinding

即:布局名 驼峰规则+Binding

根布局不可设置其他值



只能是

<2> 关于布局标签




    

        
    

    ...

(1) 布局根布局需要修改成

(2) 格式固定。

(3) 最内层标签 name:对应的属性即Java声明的变量。比如 Student student = new Student(); 其实就是一个变量名。type:对应的属性即Java类的全路径。相当于import 包。如果类比较多 还可以


    
     

即:import type="com.wjn.okhttpmvpdemo.databinding.Student"

<3> 需要先在布局中声明然后才会在相应的Activity中自动生成XXXBinding类

Activity使用

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.wjn.okhttpmvpdemo.R;

public class DataBindingActivity extends AppCompatActivity {

    private ActivityDataBindingBinding mDataBindingBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDataBindingBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
        initView();
    }

    /**
     * 初始化View
     */

    private void initView() {
        Student student = new Student();
        student.setName("张三");
        student.setSex("男");
        student.setAge("29");
        mDataBindingBinding.setStu(student);
    }

}

ActivityDataBindingBinding 就是自动生成的XXXBinding类。

设置布局使用

mDataBindingBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);

结果

DataBinding(数据绑定)基础讲解_第1张图片

二.绑定多种变量

布局文件




    

        

        

        

        

        

        

    

    


        

        

        

        

        

        

        

        

        

        

        

        

        

        

    

Activity使用

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.wjn.okhttpmvpdemo.R;

public class MoreActivity extends AppCompatActivity {

    private ActivityMoreBinding mActivityMoreBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivityMoreBinding = DataBindingUtil.setContentView(this, R.layout.activity_more);
        initView();
    }

    /**
     * 初始化View
     */

    private void initView() {
        Student student = new Student();
        student.setName("张三");
        student.setSex("男");
        student.setAge("29");
        mActivityMoreBinding.setStudent(student);//对应布局 student

        mActivityMoreBinding.setStringValue("字符串");//对应布局 stringValue

        mActivityMoreBinding.setBoobleValue(true);//对应布局 boobleValue

        mActivityMoreBinding.setIntValue(12);//对应布局 intValue

        mActivityMoreBinding.setFloatValue(12.12f);//对应布局 floatValue

        String string[] = new String[]{"数组0下标对应值", "数组1下标对应值", "数组2下标对应值"};
        mActivityMoreBinding.setArrayValue(string);//对应布局 arrayValue
    }

}

结果

DataBinding(数据绑定)基础讲解_第2张图片

三.绑定点击事件

布局




    

        

        
    

    

        

        
    

说明

 

<1> name:自定义,可以任意值。设置监听时set+name值。

<2> type:Activity类所在的全路径。

android:onClick="@{setTextViewOnClick.onTextViewClick}"

<1> setTextViewOnClick:布局文件中的name值。

<2> onTextViewClick:Activity定义的点击事件方法。

Activity使用

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import com.wjn.okhttpmvpdemo.R;

public class DataBindingActivity extends AppCompatActivity {

    private ActivityDataBindingBinding mDataBindingBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDataBindingBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
        initView();
    }

    /**
     * 初始化View
     */

    private void initView() {
        Student student = new Student();
        student.setName("张三");
        student.setSex("男");
        student.setAge("29");
        mDataBindingBinding.setStu(student);
        //设置点击事件
        mDataBindingBinding.setSetTextViewOnClick(this);
    }

    /**
     * 点击事件
     */

    public void onTextViewClick(View view) {
        Student student = new Student();
        student.setName("张三222");
        student.setSex("男222");
        student.setAge("29222");
        mDataBindingBinding.setStu(student);

        String name = mDataBindingBinding.getStu().getName();
        Log.d("TAG", "获取姓名:" + name);
    }

}

说明

//设置点击事件
mDataBindingBinding.setSetTextViewOnClick(this);

setXXX:XXX取值:布局文件中的name值

/**
 * 点击事件
 */

public void onTextViewClick(View view) {
    Student student = new Student();
    student.setName("张三222");
    student.setSex("男222");
    student.setAge("29222");
    mDataBindingBinding.setStu(student);

    String name = mDataBindingBinding.getStu().getName();
    Log.d("TAG", "获取姓名:" + name);
}

onTextViewClick:布局文件中@{setTextViewOnClick.onTextViewClick} 后面的值

结果

D/TAG: 获取姓名:张三222

四.绑定表达式

布局




    

        

    

    

        

        

        

        

        

    

实体类

package com.wjn.okhttpmvpdemo.databinding;

public class BooleanBean {

    public boolean isMan;
    public boolean isSuccess;
    public boolean isDay;

    public boolean isMan() {
        return isMan;
    }

    public void setMan(boolean man) {
        isMan = man;
    }

    public boolean isSuccess() {
        return isSuccess;
    }

    public void setSuccess(boolean success) {
        isSuccess = success;
    }

    public boolean isDay() {
        return isDay;
    }

    public void setDay(boolean day) {
        isDay = day;
    }
}

Activity调用

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.wjn.okhttpmvpdemo.R;

public class DataBindingActivity extends AppCompatActivity {

    private ActivityDataBindingBinding mDataBindingBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDataBindingBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
        initView();
    }

    /**
     * 初始化View
     */

    private void initView() {
        BooleanBean booleanBean = new BooleanBean();
        booleanBean.setDay(false);
        booleanBean.setMan(false);
        booleanBean.setSuccess(true);
        mDataBindingBinding.setMyBoolean(booleanBean);
    }

}

说明

如果上面表达式有中文时不能编译通过。可能是Java环境的问题,在系统环境变量中增加一个变量,变量名为: JAVA_TOOL_OPTIONS, 变量值为:-Dfile.encoding=UTF-8,保存。要重启一次电脑,中文就解决了。

可使用的表达式

Mathematical + - / * %
String concatenation +
Logical && ||
Binary & | ^
Unary + - ! ~
Shift >> >>> <<
Comparison == > < >= <=
instanceof
Grouping ()
Literals - character, String, numeric, null
Cast
Method calls
Field access
Array access []
Ternary operator ?:

不支持的表达式

this
super
new
Explicit generic invocation

Data Binding Library 使用别名

假如我们import了两个相同名称的类。使用下面 “别名”方式区分

...

  
  



...

五.设置View显示隐藏

布局文件



    


    





即data标签引入

然后

android:visibility="@{XXXBean.isGone?View.GONE:View.VISIBLE}"

六.数据改变

DataBinding使用时,如果数据发生改变。怎么更新Xml布局中的内容呢?下面讲。

1.BaseObservable监听数据改变

步骤

<1> 实体类中 要继承BaseObservale。

<2> 实体类中 getXXX方法上使用注解@Bindable。

<3> 实体类中 setXXX方法里调用方法notifyPropertyChanged。

实体类

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.BaseObservable;
import android.databinding.Bindable;

public class People extends BaseObservable {

    private int fieldId = 10;

    private String name;
    private String age;

    @Bindable
    public String getName() {
        return name;
    }

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

    @Bindable
    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
        notifyPropertyChanged(fieldId);
    }
}

Activity使用

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import com.wjn.okhttpmvpdemo.R;

public class DataBindingActivity extends AppCompatActivity {

    private ActivityDataBindingBinding mDataBindingBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDataBindingBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
        initView();
    }

    /**
     * 初始化View
     */

    private void initView() {
        People people = new People();
        people.setName("张三");
        people.setAge("20");
        mDataBindingBinding.setPeople(people);
        Log.d("TAG", "默认Name:" + mDataBindingBinding.getPeople().getName());
        //设置点击事件
        mDataBindingBinding.setSetTextViewOnClick(this);
    }

    /**
     * 点击事件
     */

    public void onTextViewClick(View view) {
        People people = new People();
        people.setName("张三 点击");
        people.setAge("40");
        mDataBindingBinding.setPeople(people);
        Log.d("TAG", "改变后Name:" + mDataBindingBinding.getPeople().getName());
    }

}

结果

默认

D/TAG: 默认Name:张三

点击

D/TAG: 改变后Name:张三 点击

2.其他BaseObservable

ObservableField:对应实体类中 String类型。

ObservableBoolean :对应实体类中 boolean类型。

ObservableByte:对应实体类中 byte类型。

ObservableChar:对应实体类中 Char类型。

ObservableShort:对应实体类中 Short类型。

ObservableInt:对应实体类中 Int类型。

ObservableLong:对应实体类中 Long类型。

ObservableFloat:对应实体类中 Float类型。

ObservableDouble:对应实体类中 Double类型。

ObservableParcelable:对应实体类 序列化

ObservableArrayMap:对应Map

ObservableArrayList:对应集合

3.常量使用举例

实体类

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.ObservableBoolean;
import android.databinding.ObservableDouble;
import android.databinding.ObservableField;
import android.databinding.ObservableInt;

public class WoMan {

    public ObservableField name = new ObservableField<>();//String类型
    public ObservableInt age = new ObservableInt();//Int类型
    public ObservableDouble monty = new ObservableDouble();//Double类型
    public ObservableBoolean isWoMan = new ObservableBoolean();//布尔类型

}

布局




    

        

    

    

        

        

        

        

        

        

        

        
    

Activity使用

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.wjn.okhttpmvpdemo.R;

public class DataBindingActivity extends AppCompatActivity {

    private ActivityDataBindingBinding mDataBindingBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDataBindingBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
        initView();
    }

    /**
     * 初始化View
     */

    private void initView() {
        WoMan woMan = new WoMan();
        woMan.name.set("小红");
        woMan.age.set(22);
        woMan.isWoMan.set(true);
        woMan.monty.set(11111.50d);
        mDataBindingBinding.setWoman(woMan);
    }

}

4.Map&集合使用举例

布局




    

        

        

    

    

        

        

        

        

        

        

        

        
    

Activity调用

package com.wjn.okhttpmvpdemo.databinding;

import android.databinding.DataBindingUtil;
import android.databinding.ObservableArrayList;
import android.databinding.ObservableArrayMap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.wjn.okhttpmvpdemo.R;

public class DataBindingActivity extends AppCompatActivity {

    private ActivityDataBindingBinding mDataBindingBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDataBindingBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
        initView();
    }

    /**
     * 初始化View
     */

    private void initView() {
        ObservableArrayList list = new ObservableArrayList<>();
        ObservableArrayMap map = new ObservableArrayMap<>();
        list.add("韦德");
        list.add("詹姆斯");
        map.put("name", "鲁能泰山一队");
        map.put("names", "鲁能泰山预备队");
        mDataBindingBinding.setList(list);
        mDataBindingBinding.setMap(map);
    }

}

说明



Map&集合使用时 type:ObservableArrayMap&ObservableArrayList的全路径

DataBinding(数据绑定)基础讲解_第3张图片

附:Data Binding Library官方链接

https://developer.android.google.cn/topic/libraries/data-binding/

你可能感兴趣的:(Android,Jetpack,Data,Binding,Library,Android,Data,Binding)