DataBinding數(shù)據(jù)綁定基本講解

DataBinding簡(jiǎn)介

DataBinding是基于MVVM思想實(shí)現(xiàn)數(shù)據(jù)與UI綁定的框架,有了Data Binding咽斧,在Android中也可以很方便的實(shí)現(xiàn)MVVM路鹰。它于2015年7月由Google在Studio1.3上引入贷洲,2016年4月在Studio2.0上得到正式支持。DataBinding是一個(gè)support庫(kù)晋柱,最低支持到Android2.1(API Level 7+)优构。

在引入DataBinding之前,我們需要敲很多很雞肋的代碼雁竞,如 findViewById()钦椭、setText(),setVisibility()碑诉,setEnabled() 或 setOnClickListener() 等彪腔,通過(guò) DataBinding , 我們可以通過(guò)聲明式布局以精簡(jiǎn)的代碼來(lái)綁定應(yīng)用程序邏輯和布局,這樣就不用編寫(xiě)大量的冗余的代碼了进栽。這一節(jié)我們來(lái)講一講DataBinding的基本實(shí)現(xiàn)之常量綁定德挣、變量綁定與事件綁定。

初始化

在build.gradle中添加

android {
    dataBinding {
        enabled = true;
    }
    ......
}

在xml文件最外層結(jié)構(gòu)添加

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    ......
</layout>

即是將最外層標(biāo)簽改為<layout></layout>

替換原setContentView方法

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

命名規(guī)則:這里的ActivityMainBinding命名由來(lái)是其layout名稱轉(zhuǎn)換為駝峰形式再加上"Binding得到"快毛。例如activity_main->ActivityMainBinding格嗅。

開(kāi)始綁定

常量綁定

在xml中:

<TextView
    android:id="@+id/text_view1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

在Activity中:

binding.textView1.setText("Helloworld");

命名規(guī)則:控件id帶下劃線時(shí),調(diào)用時(shí)使用其id的駝峰命名形式 唠帝。不帶下劃線時(shí)屯掖,調(diào)用時(shí)與id一致。例如id為text_view1襟衰,調(diào)用時(shí)使用binding.textView1贴铜。

變量綁定

首先創(chuàng)建一個(gè)簡(jiǎn)單的數(shù)據(jù)來(lái)源類MyBean:

package com.sherlock.databindingdemo;

public class MyBean {
    private String name;
    private int age;
    
    public MyBean(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
}

然后在xml文件layout標(biāo)簽下添加:

<data>
    <variable
        name="mybean"
        type="com.sherlock.databindingdemo.MyBean" /> 
</data>
<!--name:提供數(shù)據(jù)的bean的別名;type:bean的類名-->

在控件中設(shè)置變量綁定:

<TextView
    android:id="@+id/text_view1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="10dp"
    android:text="@{mybean.name}"/>

在Activity中設(shè)置數(shù)據(jù):

binding.setMybean(myBean);
//binding.setVariable(BR.mybean,myBean);        //另一種方法

注意@{mybean.name}中的name必須為String類型瀑晒,若要綁定別的類型绍坝,比如int類型,可以這樣@{String.valueOf(mybean.age)}苔悦。

事件綁定

當(dāng)然我們也可以用DataBinding實(shí)現(xiàn)事件綁定轩褐,它有兩種實(shí)現(xiàn)方式。

第一種:首先添加一個(gè)事件回調(diào)類Presenter间坐,這里演示Click與TextChange事件:

public class Presenter {
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        myBean.setName(s.toString());
        binding.setMybean(myBean);
    }
    public void onClick(View view){
        Toast.makeText(MainActivity.this, "點(diǎn)擊成功", Toast.LENGTH_SHORT).show();
    }
}

注意:使用這種事件綁定方式,Presenter中的方法需和控件監(jiān)聽(tīng)方法完全一致邑退。

在xml中:

<data>
    <variable
        name="presenter"
        type="com.sherlock.databindingdemo.MainActivity.Presenter" />
</data>

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onTextChanged="@{presenter.onTextChanged}" />
    <!--或者@{presenter::onTextChanged}-->

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="@{presenter.onClick}" />
    <!--或者@{presenter::onClick}-->  

在Activity中:

binding.setPresenter(new Presenter());

第二種:也可以設(shè)置自定義的監(jiān)聽(tīng)器Binding竹宋,可回傳參數(shù),需要使用Lambda表達(dá)式:

在xml中:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="@{() -> presenter.onButtonClick(mybean)}" />
    <!--或者@{(view) -> presenter.onButtonClick(mybean)}-->

在Presenter中:

public void onButtonClick(MyBean myBean){
    Toast.makeText(MainActivity.this, myBean.getName(), Toast.LENGTH_SHORT).show();
}

注意:使用這種事件綁定地技,Presenter中的監(jiān)聽(tīng)方法就不需要與View的監(jiān)聽(tīng)方法完全一致了蜈七,而且可以獲取View在事件中回傳的數(shù)據(jù)。

總結(jié)

這一節(jié)到此DataBinding的常量莫矗,變量飒硅,事件綁定的用法就講解完畢了砂缩,實(shí)際操作起來(lái)感覺(jué)目前AndroidStudio對(duì)DataBinding的支持還不夠,排錯(cuò)有點(diǎn)費(fèi)勁三娩,有時(shí)會(huì)出現(xiàn)找不到DataBinding的錯(cuò)誤庵芭,這時(shí)應(yīng)先查看下是否由于自己修改了某個(gè)類名,而xml調(diào)用時(shí)沒(méi)有修改導(dǎo)致雀监。若沒(méi)有問(wèn)題則刪除app下的build文件夾重新Rebuild下項(xiàng)目試試双吆。

首次接觸DataBinding,可能有寫(xiě)的不對(duì)的地方歡迎大神們留言指正会前,有什么疑惑或者不懂的地方也可以在我Github上DataBindingDemo項(xiàng)目的Issues中提出好乐,我會(huì)及時(shí)解答。

附上DataBindingDemo地址:
DataBindingDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓦宜,一起剝皮案震驚了整個(gè)濱河市蔚万,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌临庇,老刑警劉巖反璃,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異苔巨,居然都是意外死亡版扩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門侄泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)礁芦,“玉大人,你說(shuō)我怎么就攤上這事悼尾∈量郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵闺魏,是天一觀的道長(zhǎng)未状。 經(jīng)常有香客問(wèn)我,道長(zhǎng)析桥,這世上最難降的妖魔是什么司草? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮泡仗,結(jié)果婚禮上埋虹,老公的妹妹穿的比我還像新娘。我一直安慰自己娩怎,他們只是感情好搔课,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著截亦,像睡著了一般爬泥。 火紅的嫁衣襯著肌膚如雪柬讨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天袍啡,我揣著相機(jī)與錄音踩官,去河邊找鬼。 笑死葬馋,一個(gè)胖子當(dāng)著我的面吹牛卖鲤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畴嘶,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蛋逾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了窗悯?” 一聲冷哼從身側(cè)響起区匣,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒋院,沒(méi)想到半個(gè)月后亏钩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欺旧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年姑丑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辞友。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栅哀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出称龙,到底是詐尸還是另有隱情留拾,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布鲫尊,位于F島的核電站痴柔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疫向。R本人自食惡果不足惜咳蔚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搔驼。 院中可真熱鬧谈火,春花似錦、人聲如沸匙奴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泼菌。三九已至谍肤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哗伯,已是汗流浹背荒揣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焊刹,地道東北人系任。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虐块,于是被迫代替她去往敵國(guó)和親俩滥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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