DataBinding(上)

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&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)系作者
  • 序言:七十年代末琳状,一起剝皮案震驚了整個(gè)濱河市磕瓷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖困食,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件边翁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡硕盹,警方通過(guò)查閱死者的電腦和手機(jī)符匾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瘩例,“玉大人啊胶,你說(shuō)我怎么就攤上這事《庀停” “怎么了焰坪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)聘惦。 經(jīng)常有香客問(wèn)我某饰,道長(zhǎng),這世上最難降的妖魔是什么善绎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任黔漂,我火速辦了婚禮,結(jié)果婚禮上禀酱,老公的妹妹穿的比我還像新娘炬守。我一直安慰自己,他們只是感情好剂跟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布劳较。 她就那樣靜靜地躺著,像睡著了一般浩聋。 火紅的嫁衣襯著肌膚如雪观蜗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天衣洁,我揣著相機(jī)與錄音墓捻,去河邊找鬼。 笑死坊夫,一個(gè)胖子當(dāng)著我的面吹牛砖第,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播环凿,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梧兼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了智听?” 一聲冷哼從身側(cè)響起羽杰,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渡紫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后考赛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惕澎,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年颜骤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唧喉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忍抽,死狀恐怖八孝,靈堂內(nèi)的尸體忽然破棺而出兄旬,到底是詐尸還是另有隱情丧叽,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布箩祥,位于F島的核電站锈锤,受9級(jí)特大地震影響驯鳖,放射性物質(zhì)發(fā)生泄漏闲询。R本人自食惡果不足惜久免,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扭弧。 院中可真熱鬧阎姥,春花似錦、人聲如沸鸽捻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)御蒲。三九已至衣赶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厚满,已是汗流浹背府瞄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碘箍,地道東北人遵馆。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丰榴,于是被迫代替她去往敵國(guó)和親货邓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容