在熟悉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方法驗證我們的單向、雙向綁定。
最後,我們看一下實際的效果,思考一下是不是比以前開發同樣需求要輕鬆很多!所以趕快嘗試一下這個開發利器吧。
源碼:https://github.com/Hynsn/DatabindingDemo