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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章