DataBinding介紹
DataBinding屬于Jetpack中的架構(gòu)組件,根據(jù)官方文檔介紹,我們可以在界面中,也就是在XML布局文件中聲明數(shù)據(jù)源沾凄,然后進(jìn)行綁定,什么意思呢知允?比如說撒蟀,經(jīng)常給一個(gè)控件設(shè)置變量的時(shí)候,經(jīng)常也會(huì)想到大量的模板代碼:
//類似這樣
TextView textView = findViewById(R.id.sample_text);
textView.setText(viewModel.getUserName());
耗時(shí)又耗費(fèi)精力温鸽,而借助于DataBinding就可以通過綁定方式進(jìn)行控件的數(shù)據(jù)進(jìn)行綁定保屯,而不用進(jìn)行findViewById等操作了。
DataBinding的單向綁定和雙向綁定
其實(shí)關(guān)于DataBinding的基本使用我在Android日記之MVC嗤朴、MVP和MVVM中介紹MVVM設(shè)計(jì)模式的時(shí)候就已經(jīng)講解過了,但是這篇文章講的主要是DataBinding的單向綁定虫溜,那什么是單向綁定呢雹姊?其實(shí)就是數(shù)據(jù)是單向的,比如一個(gè)Model里的數(shù)據(jù)發(fā)生改變衡楞,而對應(yīng)的TextView的數(shù)據(jù)也會(huì)相應(yīng)的改變吱雏,這就是單向綁定敦姻。
而雙向綁定就是輸入框(EditText)綁定了Model的值镰惦,如果Model的數(shù)據(jù)發(fā)生改變,那相應(yīng)的TextView也發(fā)生改變犬绒,就是輸入框輸入什么值旺入,TextView就是什么值。
其實(shí)實(shí)現(xiàn)雙向綁定很簡單,我們知道進(jìn)行單向向綁定的代碼如下:
android:text="@{model.name}"
而雙向綁定只需才@后面加一個(gè)“=”就好了咐鹤。
<EditText
android:text="@={model.name}"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
然后我們只需修改一下DataModel拗秘。
//繼承BaseObservable接口
public class DataModel extends BaseObservable {
private String name;
//綁定
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
//刷新數(shù)據(jù),這里是刷新全部
notifyPropertyChanged(BR._all);
}
}
最后進(jìn)行設(shè)置數(shù)據(jù)
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding activityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
DataModel dataModel = new DataModel();
activityMainBinding.setModel(dataModel);
}
}
DataBinding的事件綁定
剛剛也說到了祈惶,DataBinding是可以綁定數(shù)據(jù)進(jìn)行數(shù)據(jù)的展示和修改雕旨,但是其實(shí)也是可以綁定事件,嚴(yán)格意義上來說捧请,事件綁定也是一種變量綁定凡涩,只不過設(shè)置的變量是回調(diào)接口而已,事件綁定可用于以下多種回調(diào)事件血久。
android:onClick
android:onLongClick
android:afterTextChanged
android:onTextChanged
......
首先我們在MainActivity下面添加一個(gè)內(nèi)部監(jiān)聽類
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding activityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
DataModel dataModel = new DataModel();
activityMainBinding.setModel(dataModel);
//添加監(jiān)聽突照,沒有這個(gè)方法的話就重寫build
activityMainBinding.setPersenter(new UserPresenter());
}
public class UserPresenter {
public void onUserNameClick() {
Toast.makeText(MainActivity.this, "已點(diǎn)擊", Toast.LENGTH_SHORT).show();
}
}
}
我們還要在xml布局文件中聲明:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="model"
type="com.ju.databingdingdemo.DataModel" />
<!--聲明監(jiān)聽事件,聲明后在build-->
<variable
name="persenter"
type="com.ju.databingdingdemo.MainActivity.UserPresenter" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="默認(rèn)"
android:text="@{model.name}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={model.name}" />
<!--放入-->
<Button
android:onClick="@{()->persenter.onUserNameClick()}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="點(diǎn)擊" />
</LinearLayout>
</layout>