DataBinding詳細的使用方法及工作中常遇到的問題(一)

前言

用DataBinding差不多現(xiàn)經(jīng)手了三個項目,也用它開發(fā)了一年左右,對它的特性以及使用方面有了一些自己的理解,這里面可以和大家一起分享一下,詳解DataBinding文檔中的知識點,以及工作中可能遇到的一些問題,我每講一部分都是寫一個相應(yīng)的demo以供參考.

DataBinding是什么?

官網(wǎng)文檔地址:https://developer.android.com/topic/libraries/data-binding/index.html
翻譯文檔:自己谷歌搜索,網(wǎng)上已經(jīng)有,這里就不再翻譯
官方文檔的原話是:Data Binding Library to write declarative layouts and minimize the glue code necessary to bind your application logic and layouts,The Data Binding Library offers both flexibility and broad compatibility — it's a support library,大致的意思就是DataBinding是一個通過膠水代碼寫聲明布局文件并減少綁定應(yīng)用程序邏輯的一個具有兼容和靈活性的一個支持庫.看了之后還是一臉懵逼,不要緊,學(xué)知識嘛,慢慢來.

如何集成

集成很簡單,在你app module的Gradle下面添加的代碼:

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

提醒:現(xiàn)在建議大家的AS更新到最新,目前最新穩(wěn)定版式2.3.3.另外,你們公司如果接受了DataBinding這個還算有點新的東西,那么我建議大家使用JDK1.8,具體的詳細介紹,請看官網(wǎng)上面的介紹,https://developer.android.com/guide/platform/j8-jack.html.

AS2.1以上才支持jack,如果你得AS版本比較低的話,可以使用兼容庫Retrolambda.目前的穩(wěn)定版而言,暫時不能使用instant run.
集成如下:

android {
    defaultConfig {
        ....
        jackOptions {
            enabled true
        }
    }
    ....
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

note:如果你用的AS3.0的話,就可以不通過jack進行編譯,而且可以使用instant run,還加快的編譯速度.具體的介紹:
http://developers.googleblog.cn/2017/05/android-studio-30-canary-1.html

如何使用

在工作中,我們經(jīng)常遇到請求到一個對象,然后對象的信息需要在xml中展示的情況,用它怎么做到嗎?比普通的做法有什么優(yōu)勢?

  • 假如我們請求到的是一個學(xué)生的實體類,那么我們先創(chuàng)建一個學(xué)生類:
public class Student {
    private String name;
    private int age;
    private String headerImg;

    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;
    }

    public String getHeaderImg() {
        return headerImg;
    }

    public void setHeaderImg(String headerImg) {
        this.headerImg = headerImg;
    }
}
  • 這個學(xué)生類包括姓名,年齡和頭像的url,現(xiàn)在我們模擬一下網(wǎng)絡(luò)請求:
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo1);
        initData();
    }

    private void initData() {
        //模擬網(wǎng)絡(luò)請求部分,假如請求到了一個學(xué)生實體
        Student student = new Student();
        student.setAge(25);
        student.setName("李寧");
        student.setHeaderImg("http://i2.muimg.com/567571/b528af67d68f7597.png");
    }
  • 下面正常的做法就是拿到xml里面的空間,然后一個一個賦值上去,是不是感覺這樣做不僅要findViewById,還要拿到各種控件進行一系列的賦值挺麻煩的,這時候DataBinding的作用就展示出來了,數(shù)據(jù)綁定,就是要把數(shù)據(jù)直接綁定到xml上面.下面看我華麗的操作:
XMl中:
<?xml version="1.0" encoding="utf-8"?>
<layout>

<data>

    <variable
        name="student"
        type="com.DataBinding.lsh.databindingdemo.Student" />
</data>
    <LinearLayout 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"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical"
                  tools:context="com.DataBinding.lsh.databindingdemo.Demo1.Demo1Activity">


    </LinearLayout>
</layout>

跟布局的標(biāo)簽換了,換成了layout,其次多了data標(biāo)簽,下面有個一個varible標(biāo)簽,它的作用就是用來聲明xml中綁定的變量,這里面的Type一定要寫引用的全路徑,不過好在現(xiàn)在都可以智能提示,打上一個Student,選擇正確的一個,下面我們就要在xml的控件中綁定我們聲明變量的字段,你可能會說,咦?student只是聲明了,不是還沒有給進行賦值嗎?現(xiàn)在綁定上去不會報錯嗎?這個不用擔(dān)心,它有一系列的默認值.一陣亂敲之后:

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>

        <variable
            name="student"
            type="com.DataBinding.lsh.databindingdemo.Student" />
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:app="http://schemas.android.com/apk/res-auto"
                  xmlns:fresco="http://schemas.android.com/apk/res-auto"
                  xmlns:tools="http://schemas.android.com/tools"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical"
                  tools:context="com.DataBinding.lsh.databindingdemo.Demo1.Demo1Activity">

        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_gravity="center"
            fresco:actualImageScaleType="fitXY"
            fresco:placeholderImage="@mipmap/ic_launcher"
            fresco:placeholderImageScaleType="centerCrop"
            fresco:roundAsCircle="true" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="李寧"
            android:textSize="24sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="25"
            android:textSize="24sp" />


    </LinearLayout>
</layout>

我這里面用的加載圖片的工具是fresco,它很強大,尤其在內(nèi)存方面,而且還有一集成了一些常用的功能,比如圓形頭像,圓角頭像,gif播放,等常用的一些功能.

接下來開始綁定:


先綁定TextView的屬性,寫法如上述圖片,控件中自帶的這些屬性一般可以直接綁定,如果想綁定一些沒有的屬性,就需要自己去指定,下面綁定圖片地址展示圖片的時候會用到.我們xml中除了圖片,文本就綁定好了,那么activity要怎么操作呢?

在Activity中:
  • DataBinding通過DataBindingUtil來進行綁定視圖,常用的有兩個方法,一個是setContentView方法,一個是bind方法,前者一般用著Activity加載視圖,后者就是Fragment等.
  • 一個xml對應(yīng)一個Binding的java文件,這個文件是自動生成的,如果提示不出來這個類,重啟As,如果還是不行,把項目中的build文件夾刪除了,重新編譯,滿滿的都是經(jīng)驗啊.這個類在build下面是可以找到的,路徑如下圖:
  • 最后我們對xml中的變量進行賦值

異常
我們愉快的編譯運行,忽然閃退了,看異常:


點進去:

mboundView2就是我們設(shè)置年齡文本,后面的studentAge就是我們設(shè)置的年齡,這地方怎么會報錯呢?
想一想,原來是我們student的age是int類型的,但是text屬性不能直接設(shè)置int類型,那怎么辦?
在string.xml中

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{@string/intToString(student.age)}"
            android:textSize="24sp" />

在activity_demo1.xml中:

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{@string/intToString(student.age)}"
            android:textSize="24sp" />

其他的類型的轉(zhuǎn)化就可以參照這個去改.

綁定圖片

public class ViewBindAdapter {
    @BindingAdapter({"bind:url"})
    public static void setImgUrl(SimpleDraweeView imageView, String uri) {
        if (!TextUtils.isEmpty(uri)) {
            imageView.setImageURI(Uri.parse(uri));
        }
    }
}

xml中:

        <com.facebook.drawee.view.SimpleDraweeView
            app:url="@{student.headerImg}"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_gravity="center"
            fresco:actualImageScaleType="fitXY"
            fresco:placeholderImage="@mipmap/zhanwei"
            fresco:placeholderImageScaleType="centerCrop"
            fresco:roundAsCircle="true" />

我們新建一個類,專門存放綁定的自定義屬性,@BindingAdapter({"bind:url"})這句主要是聲明xml中寫的自定義的屬性,可以連續(xù)寫多個,比如這種:

  @BindingAdapter(value = {"uri", "placeholderImageRes", "request_width","request_height"}, requireAll = false)
    public static void loadImage(final ImageView imageView, String uri,
                                 @DrawableRes int placeholderImageRes,
                                 int width, int height){
                                 }

requireAll = false的意思是不用寫全所有參數(shù),方法的第一個參數(shù)是控件的本身,就是這么簡單,這樣就可以綁定成功了.

note:注意app:url="@{student.headerImg}"這個沒有智能提示,代碼顏色也沒有改變,都是正常的,只要寫對就行.

最新來一張圖:


到這里,這些基本的操作就完成了,你已經(jīng)對databinding有了一個大體的認識,接下來的幾篇,將會更加深入的介紹它的使用方法和底層的原理.
demo地址:https://github.com/adonis-lsh/DataBindingDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子框往,更是在濱河造成了極大的恐慌捉捅,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件习劫,死亡現(xiàn)場離奇詭異咆瘟,居然都是意外死亡,警方通過查閱死者的電腦和手機诽里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門袒餐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事灸眼∥蚤埽” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵幢炸,是天一觀的道長泄隔。 經(jīng)常有香客問我,道長宛徊,這世上最難降的妖魔是什么佛嬉? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮闸天,結(jié)果婚禮上暖呕,老公的妹妹穿的比我還像新娘。我一直安慰自己苞氮,他們只是感情好湾揽,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笼吟,像睡著了一般库物。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贷帮,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天戚揭,我揣著相機與錄音,去河邊找鬼撵枢。 笑死民晒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锄禽。 我是一名探鬼主播潜必,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沃但!你這毒婦竟也來了磁滚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤宵晚,失蹤者是張志新(化名)和其女友劉穎恨旱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坝疼,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡搜贤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钝凶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仪芒。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡唁影,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掂名,到底是詐尸還是另有隱情据沈,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布饺蔑,位于F島的核電站锌介,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏猾警。R本人自食惡果不足惜孔祸,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望发皿。 院中可真熱鬧崔慧,春花似錦、人聲如沸穴墅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玄货。三九已至皇钞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間松捉,已是汗流浹背夹界。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惩坑,地道東北人掉盅。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓也拜,卻偏偏與公主長得像以舒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子慢哈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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