Android~DataBinding使用

在熟悉MVVM框架中了解到DataBinding,MVVM的核心其实就是DataBinding。这篇文章基于登录界面小demo,给大家介绍如何使用DataBinding。

使用DataBinding步骤

1、修改app的build.gradle启用DataBinding

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 21
        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
    }
}

2、修改布局文件为DataBinding布局。
方法是:双击选中布局文件最外层布局,同时按住Alt+回车==>转换为Databinding布局。修改成功后,AS会自动生成对应的Databinding类,对应规则为test_main.xml --> TestMainBinding。

3、数据绑定:我们先要创建UserInfo实体类,再修改test_main.xml文件。数据绑定又包括单向和双向,单向绑定即当UserInfo数据发生改变时,控件(demo中的login_time_tv)会自动更新数据;双向绑定常用于输入框、ListView删除等View视图发生改变时,控件中对应的数据也需发生变化的情况。

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

import com.android.databinding.library.baseAdapters.BR;

public class UserInfo extends BaseObservable {
    private String pwd;
    private String name;
    private String loginTime;

    public UserInfo(String pwd, String name) {
        this.pwd = pwd;
        this.name = name;
    }
    @Bindable
    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
        notifyPropertyChanged(BR.pwd);
    }
    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }
    @Bindable
    public String getLoginTime() {
        return loginTime;
    }

    public void setLoginTime(String loginTime) {
        this.loginTime = loginTime;
        notifyPropertyChanged(BR.loginTime);
    }
}
<!-- test_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <!-- 声明对象 -->
        <variable
            name="user"
            type="com.example.myapplication.UserInfo" />
        <variable
            name="Activity"
            type="com.example.myapplication.MainActivity" />
    </data>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/container"
        tools:context=".MainActivity"
        android:orientation="vertical"
        android:gravity="center_horizontal|top">
        <EditText
            android:id="@+id/name_et"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="100dp"
            android:singleLine="true"
            android:text="@={user.name}"
            android:hint="用户名"/>
        <EditText
            android:id="@+id/pwd_et"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="@={user.pwd}"
            android:inputType="numberPassword"
            android:hint="密码"/>
        <TextView
            android:id="@+id/login_time_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.loginTime}"/>
        <Button
            android:id="@+id/login_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{Activity.userLogin}"
            android:text="登录"/>
    </LinearLayout>
</layout>

如何进行单向绑定?

1、UserInfo继承自BaseObservable
2、为UserInfo中需要绑定的get方法添加注解@Bindable,set方法添加notifyPropertyChanged(BR.loginTime);
3、如要进行双向绑定,再单向绑定基础上添加等号,如android:text="@={user.pwd}"

Activity中如何使用DataBinding?

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.format.Time;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.example.myapplication.databinding.TestMainBinding;

public class MainActivity extends Activity {
    final static String TAG = "Main";

    private UserInfo user;
    private TestMainBinding binding;
    private Time mTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.test_main);
        mTime = new Time();
        binding = DataBindingUtil.setContentView(MainActivity.this,R.layout.test_main);
        user = new UserInfo("","");
        binding.setUser(user);
        binding.setActivity(this);
    }

    public void userLogin(View v){
        mTime.setToNow();
        int year = mTime.year;
        int month = mTime.month+1;
        int day = mTime.monthDay;
        int hour = mTime.hour;
        int minute = mTime.minute;
        // 双向绑定
        Log.d(TAG, "userLogin: "+user.getName()+","+user.getPwd());
        Toast.makeText(getApplicationContext(),user.getName()+"登录中",Toast.LENGTH_SHORT).show();
        // 单向绑定
        user.setLoginTime("上次登录时间:"+year+"年"+month+"月"+day+"日"+hour+":"+minute);
    }
}

代码中,我们先使用DataBindingUtil.setContentView(MainActivity.this,R.layout.test_main);获取binding对象,初始化test_main中声明的对象属性user、Activity
接下来为login_btn注册点击事件和编写userLogin方法验证我们的单向、双向绑定。
最后,我们看一下实际的效果,思考一下是不是比以前开发同样需求要轻松很多!所以赶快尝试一下这个开发利器吧。
demo动图
源码:https://github.com/Hynsn/DatabindingDemo

发布了99 篇原创文章 · 获赞 185 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/Bluechalk/article/details/102879385