android dataBinding 简单demo

app的gradle添加
 dataBinding {
        enabled = true
    }
具体些:android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.wang.myapplication"
        minSdkVersion 20
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}
布局文件:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable name="user"   type="com.example.wang.myapplication.User"/>
        <variable name="main"   type="com.example.wang.myapplication.MainActivity" />

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"
            android:textIsSelectable="true"
            android:textSize="20sp" />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"
            android:onClick="myClick"
            android:textSize="25sp" />
    </LinearLayout>
</layout>

定义一个用户类:

BaseObservable类,我们只要把Model类继承自它就获得了通知UI更新数据的能力了,再getter方法上添加Bindable注解,在setter方法中使用notifying提醒UI更新数据。

package com.example.wang.myapplication;

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

/**
 * 作者:
 * 时间: 2018/6/14 17:20
 * <p>
 * 描述:
 * Observable是个接口,Google为我们提供了一个BaseObservable类,我们只要把Model类继承自它就获得了通知UI更新数据的能力了.
 * <p>
 * getter方法都添加了 注解 @Bindable,它支持该属性在BR类中产生一个对应的静态int类型常量,
 * setter方法中多了一句notifyPropertyChanged(BR.xxx)提醒UI更新数据。
 * 至于什么是BR,可以理解为它类似于我们认识的R类.
 * Bindable注解会自动生成一个BR类,该类位于app module包下,通过BR类我们设置更新的数据,
 * 当Model中的数据发生变化时,setter方法中的notifyPropertyChanged()就会通知UI更新数据了。
 */
public class User extends BaseObservable {

    private String firstName;
    private String lastName;

    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Bindable
    public String getFirstName() {
        return this.firstName;
    }

    @Bindable
    public String getLastName() {
        return this.lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);

    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);

    }


}




package com.example.wang.myapplication;

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

import com.example.wang.myapplication.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    //Data Binding为我们生成了databinding包,以及ActivityMainBinding类
    private ActivityMainBinding binding;
    private User user;
    private int n = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 获取<data />标签对象
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        user = new User("Micheal", "Jack");

        binding.setUser(user); // 绑定到User到布局对象中.//绑定方法1
       // binding.setVariable(BR.user, user);//绑定方法2

    }

    //参数View必须有,必须是public,参数View不能改成对应的控件,只能是View,否则编译不通过
    public void myClick(View view) {
        n++;
        user.setFirstName("点击" + n);
    }


}

另一种方法:

xml不变.

user类只需要如此:

package com.example.wang.myapplication;

import android.databinding.BaseObservable;
import android.databinding.Bindable;
import android.databinding.ObservableField;
import android.databinding.ObservableInt;

/**
 * 通知UI更新的方法是用User类继承自BaseObservable,然后在getter上添加注解、在setter中添加notify方法,
 * 这感觉总是有点麻烦,步骤繁琐,于是,Google推出ObservableFields类,使用它我们可以简化我们的Model类。
 * ObservableField<T>中传入的泛型可以是Java中的基本类型,
 * 当然我们还可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt,
 * ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable等具体的类型,效果也和ObservableField<T>是一样的.
 * 如:
 *      public final ObservableField<Integer> userAge = new ObservableField<>();
 等同于 public final ObservableInt userAge = new ObservableInt();
 */
public class User  {
    public final ObservableField<String> firstName = new ObservableField<>();
    public final ObservableField<String> lastName = new ObservableField<>();

}

activity改为下面,可以实现一样的效果:
package com.example.wang.myapplication;

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

import com.example.wang.myapplication.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    //Data Binding为我们生成了databinding包,以及ActivityMainBinding类
    private ActivityMainBinding binding;
    private User user;
    private int n = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 获取<data />标签对象
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        user=new User();
        user.firstName.set("wang");
        user.lastName.set("btn");
        binding.setUser(user);

    }

    //参数View必须有,必须是public,参数View不能改成对应的控件,只能是View,否则编译不通过
    public void myClick(View view) {
        n++;
       // user.setFirstName("点击" + n);
        user.firstName.set("点击" + n);
    }



}



                                    
发布了37 篇原创文章 · 获赞 23 · 访问量 12万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览