DataBinding(上)

DataBinding的簡(jiǎn)單使用

概述

  • DataBinding是一個(gè)Support庫,可以兼容到Android 2.1
  • 使用DataBinding需要將Gradle插件升級(jí)到1.5.0及以上并且Android Studio的版本在1.3以上

配置環(huán)境

首先打開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í)體類的引用。接下來在用到的地方只需要使用@{}在花括號(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類,接下來就可以使用該類進(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)聽器。
    簡(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>

接下來就可以在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">

通過制定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è)問好?沒錯(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&lt;String&gt;"/>
</data>

tips:String左邊和右邊的兩個(gè)東西是何物?其實(shí)是對(duì)<>的轉(zhuǎn)義。簡(jiǎn)而言之一句話,&lt;代表<,&gt;代表>。
還有一個(gè)就是記得使用Binding Class進(jìn)行數(shù)據(jù)的設(shè)置。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容