DataBinding的簡(jiǎn)單使用
概述
- DataBinding是一個(gè)Support庫(kù)踪区,可以兼容到Android 2.1
- 使用DataBinding需要將Gradle插件升級(jí)到1.5.0及以上并且Android Studio的版本在1.3以上
配置環(huán)境
首先打開(kāi)module下的build.gradle,添加如下的代碼片段
android {
....
dataBinding {
enabled = true
}
}
定義Bean實(shí)體類
public class User {
private final String firstName;
private final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
創(chuàng)建DataBinding布局文件
DataBinding布局文件是以<layout>
標(biāo)簽作為根節(jié)點(diǎn)的,里面包含是兩個(gè)子元素吊骤。一個(gè)<data>
標(biāo)簽和一個(gè)view根節(jié)點(diǎn)的標(biāo)簽缎岗。
在layout文件夾下新建一個(gè)activity_main.xml文件,根節(jié)點(diǎn)設(shè)置為layout白粉,如下是一個(gè)定義好的DataBinding布局文件
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.chenyichao.databindingdemoproject.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
在<data>
標(biāo)簽中使用<variable>
標(biāo)簽定義布局中使用到的實(shí)體類的引用传泊。接下來(lái)在用到的地方只需要使用@{}
在花括號(hào)中即可使用<data>標(biāo)簽中定義的實(shí)體類引用。
綁定數(shù)據(jù)
Android Studio會(huì)自動(dòng)生成Binding class鸭巴,生成的類默認(rèn)以xml布局的命名為基礎(chǔ)眷细。例如定義的xml文件名為activity_main.xml
則會(huì)生成一個(gè)ActivityMainBinding類,接下來(lái)就可以使用該類進(jìn)行數(shù)據(jù)的綁定了鹃祖。
在Activity的onCreate()
方法中使用生成的Binding類溪椎。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
User user = new User("Test","User");
binding.setUser(user);
}
事件處理
- Method References
定義一個(gè)事件處理的類,里面有事件處理的方法
Method Reference要求定義的方法參數(shù)列表與關(guān)聯(lián)的屬性要求的參數(shù)列表要一致。
public class UserHandlers {
private static final String TAG = "UserHandlers";
//注意此處的參數(shù)為View校读,與常用的在Activity中定義方法沼侣,在xml中配置onClick屬性類似
public void onClickFirstName(View view) {
Log.d(TAG, "onClickFirstName: ");
Toast.makeText(view.getContext(), "onClickFirstName", Toast.LENGTH_SHORT).show();
}
}
修改activity_main.xml
在<data>
標(biāo)簽中添加<variable>
變量。
<data>
<variable
name="user"
type="com.example.chenyichao.databindingdemoproject.User" />
<variable
name="handlers"
type="com.example.chenyichao.databindingdemoproject.UserHandlers"/>
</data>
在控件中使用定義的變量的方法
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:onClick="@{handlers::onClickFirstName}"/>
最后歉秫,在onCreate()
方法設(shè)置Handler
binding.setHandlers(new UserHandlers());
- Listener Bindings
相比于Method Reference蛾洛,Listener Bindings有兩個(gè)不同的點(diǎn)。一是不要求參數(shù)列表與xml屬性要求的參數(shù)列表相同端考,只要求返回值類型相同即可。二是只有在事件觸發(fā)的時(shí)候DataBinding才會(huì)創(chuàng)建并注冊(cè)必要的監(jiān)聽(tīng)器揭厚。
簡(jiǎn)單示例
//定一個(gè)類
public class Presenter {
private static final String TAG = "Presenter";
public void onSaveClick(int a) {
Log.d(TAG, "onSaveClick: " + a);
}
}
xml<data>
標(biāo)簽添加變量和view控件中使用方法
<data>
<variable name="presenter"
type="com.example.chenyichao.databindingdemoproject.Presenter"/>
</data>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:onClick="@{()->presenter.onSaveClick(1)}"/>
詳解Layout
imports:<import>
在<data>
標(biāo)簽中使用<import>
標(biāo)簽可以像Java一樣導(dǎo)入使用到的類
<data>
<import type="android.view.View"/>
</data>
接下來(lái)就可以在view控件中使用View中的一些方法却特。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:visibility="@{user.adult?View.VISIBLE:View.GONE}"/>
variables:<variable>
在<data>
標(biāo)簽中可以定義多個(gè)<variable>
標(biāo)簽。每個(gè)標(biāo)簽定義了一個(gè)屬性筛圆,只有定義了該標(biāo)簽裂明,在之后的view空間才能夠使用dataBinding的表達(dá)式。
重命名Binding Class
<data class="UserBinding">
通過(guò)制定class屬性就可以更改Binding Class的命名太援。
DataBinding表達(dá)式
DataBinding的表達(dá)式和Java的表達(dá)式基本相似闽晦。一些邏輯運(yùn)算符,類的公有方法等都可以在DataBinding表達(dá)式中使用提岔。舉個(gè)例子:
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
以下四個(gè)是在DataBinding表達(dá)式中相較于Java表達(dá)式?jīng)]有的:
- this
- super
- new
- 泛型
<T>
DataBinding表達(dá)式特有的:
??
兩個(gè)問(wèn)好仙蛉?沒(méi)錯(cuò)。Null聯(lián)合運(yùn)算符是DataBinding中獨(dú)有的運(yùn)算符碱蒙。是一個(gè)二目運(yùn)算符荠瘪,代表的含義是參與操作的左邊的變量不為null則取左邊的變量的值,左邊為空則取右邊的變量的值赛惩。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName??user.lastName}" />
自動(dòng)避免空指針異常
DataBinding表達(dá)式會(huì)自動(dòng)的檢查為空的引用哀墓,并且自動(dòng)的避免空指針異常。例如下面的例子
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.age}" />
如果user為null喷兼,age為int型篮绰,則會(huì)自動(dòng)使用默認(rèn)值0進(jìn)行賦值。
集合類
使用集合類首先要在<data>
標(biāo)簽中先導(dǎo)入
<data class="UserBinding">
<import type="java.util.List"/>
</data>
接著是定義變量
<data class="UserBinding">
<import type="java.util.List"/>
<variable
name="list"
type="List<String>"/>
</data>
tips:String左邊和右邊的兩個(gè)東西是何物季惯?其實(shí)是對(duì)<>的轉(zhuǎn)義吠各。簡(jiǎn)而言之一句話,<
代表<勉抓,>
代表>走孽。
還有一個(gè)就是記得使用Binding Class進(jìn)行數(shù)據(jù)的設(shè)置。