日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
AndroidDataBinding用戶指南

1. 介紹

在張家川回族自治等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供做網(wǎng)站、網(wǎng)站建設 網(wǎng)站設計制作按需開發(fā)網(wǎng)站,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,全網(wǎng)整合營銷推廣,外貿(mào)網(wǎng)站建設,張家川回族自治網(wǎng)站建設費用合理。

這篇文章介紹了如何使用Data Binding庫來寫聲明的layouts文件,并且用最少的代碼來綁定你的app邏輯和layouts文件。

Data Binding庫不僅靈活而且廣泛兼容- 它是一個support庫,因此你可以在所有的Android平臺***能到Android 2.1(API等級7+)上使用它。

需要:Android Studio 1.3.0-beta1 或更高版本。

測試版本

請注意:Data Binding庫當前是測試版本。在Data Binding處于測試階段時,開發(fā)者應該了解以下注意事項:

這是旨在生成開發(fā)者的反饋功能的測試版本。它可能包含bugs,或者不適合你的使用案例,所以需要您在使用它時自擔風險。即便如此,我們非常希望得到您的反饋!使用issue tracker來讓我們知道對于你的使用案例什么可以工作或者不能工作。

Data Binding庫的測試版本傾向于顯著的改變,包括那些不是與您的應用程序兼容的源代碼。即,在未來可能會進行大量的返工來更新此庫。

雖然伴有標準Android SDK和Google Play服務條款適用警告,開發(fā)人員可以隨時發(fā)布內(nèi)置了與Data Binding庫beta版本的應用程序。而且采用新的庫或工具是一個相當好的主意來徹底測試你的應用程序。

我們在這個時候才剛剛開始與Android Studio的支持。未來會有進一步的Android Studio的支持。

通過使用Data Binding庫beta版本,你承認這些警告。

2. 構建環(huán)境

要開始使用Data Binding,首先需要在Android SDK Manager的支持庫里下載該庫。

請確保您使用的是 Android Studio 的兼容版本。Android Studio的Data Binding 插件需要 Android Studio 1.3.0-beta1 或更高版本。

工作環(huán)境

你的app要使用Data Binding,需要添加Data Binding到gradle構建文件里,如下:

 
 
  1. dependencies {
  2. classpath "com.android.tools.build:gradle:1.2.3"
  3. classpath "com.android.DataBinding:dataBinder:1.0-rc0"
  4. }
  5. }

然后確保jcenter在repositories列表里,如下:

 
 
  1. allprojects {
  2. repositories {
  3. jcenter()
  4. }
  5. }

在每一個你想要使用Data Binding的module,添加如下的插件:

apply plugin: ‘com.android.application'

apply plugin: 'com.android.databinding'

Data Binding插件將會在你的項目內(nèi)添加必需提供的以及編譯配置依賴。

3. Data Binding Layout 文件

Data Binding表達式

Data Binding layout文件有點不同的是:起始根標簽是 layout,接下來一個 data 元素以及一個 view 的根元素。這個 view 元素就是你沒有使用Data Binding的layout文件的根元素。舉例說明如下:

 
 
  1. android:orientation="vertical"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4. android:layout_height="wrap_content"
  5. android:text="@{user.firstName}"/>
  6. android:layout_height="wrap_content"
  7. android:text="@{user.lastName}"/>

在 data 內(nèi)描述了一個名為user的變量屬性,使其可以在這個layout中使用:

在layout的屬性表達式寫作@{},下面是一個TextView的text設置為user的firstName屬性:

 
 
  1. android:layout_height="wrap_content"
  2. android:text="@{user.firstName}"/>

Data對象

假設你有一個user的plain-old Java Object(POJO):

 
 
  1. public class User {
  2. public final String firstName;
  3. public final String lastName;
  4. public User(String firstName, String lastName) {
  5. this.firstName = firstName;
  6. this.lastName = lastName;
  7. }
  8. }

這個類型的對象擁有從不改變的數(shù)據(jù)。在app中它是常見的,可以讀取一次并且之后從不改變。當然也可以使用JavaBeans對象:

 
 
  1. public class User {
  2. private final String firstName;
  3. private final String lastName;
  4. public User(String firstName, String lastName) {
  5. this.firstName = firstName;
  6. this.lastName = lastName;
  7. }
  8. public String getFirstName() {
  9. return this.firstName;
  10. }
  11. public String getLastName() {
  12. return this.lastName;
  13. }
  14. }

從Data Binding的角度來看,這兩個類是等價的。用于TextView中的android:text屬性的表達式@{user.firstName}將訪問前者POJO對象中的firstName和后者JavaBeans對象中的getFirstName()方法。

Binding數(shù)據(jù)

默認情況下,一個Binding類會基于layout文件的名稱而產(chǎn)生,將其轉(zhuǎn)換為Pascal case(譯注:首字母大寫的命名規(guī)范)并且添加“Binding”后綴。上述的layout文件是activity_main.xml,因此生成的類名是ActivityMainBinding。此類包含從layout屬性到layout的Views中所有的bindings(例如user變量),并且它還知道如何給Binding表達式分配數(shù)值。創(chuàng)建bindings的最簡單的方式是在inflating(譯注:layout文件與Activity/Fragment的“鏈接”)期間如下:

 
 
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
  5. User user = new User("Test", "User");
  6. binding.setUser(user);
  7. }
  8. 就是這樣,運行app后,你將會看到Test User?;蛘吣憧梢酝ㄟ^如下獲取View:
  9. MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());
  10. 如果你在ListView或者RecyclerView adapter使用Data Binding時,你可能會使用:
  11. ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup,
  12. false);
  13. //or
  14. ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

#p#

4. 深入 Layout 文件

Import

零個或多個import元素可能在data元素中使用。這些只用在你的layout文件中添加引用,就像在Java中:

 
 

現(xiàn)在,View可以使用你的Binding表達式:

 
 
  1. android:text="@{user.lastName}"
  2. android:layout_width="wrap_content"
  3. android:layout_height="wrap_content"
  4. android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

當類名有沖突時,其中一個類名可以重命名為alias::

 
 
  1. alias="Vista"/>

這樣,在該layout文件中Vista對應com.example.real.estate.View,而View對應android.view.View。導入的類型可以在Variable和表達式中使用作為引用來使用:

 
 
  1. "/>

注意:Android Studio還沒有處理imports,所以自動導入Variable在你的IDE不能使用。您的app仍會正常編譯,你可以在您的Variable定義中使用完全符合規(guī)定的名稱來解決該IDE問題。

 
 
  1. android:text="@{((User)(user.connection)).lastName}"
  2. android:layout_width="wrap_content"
  3. android:layout_height="wrap_content"/>

導入的類型還可以在表達式中使用static屬性和方法:

 
 
  1. android:text="@{MyStringUtils.capitalize(user.lastName)}"
  2. android:layout_width="wrap_content"
  3. android:layout_height="wrap_content"/>

就像在Java中,java.lang。*是自動導入的。

Variables

在data中可以使用任意數(shù)量的variable元素。每一個variable元素描述了一個用于layout文件中Binding表達式的屬性。

 
 

該Variable類型在編譯時檢查,因此如果一個Variable實現(xiàn)了Observable或observable collection,這應該反映在類型中。(譯注:需要查找資料來理解)如果variable是一個沒有實現(xiàn)Observable接口的基本類或者接口,Variables不會被observed!

當對于多種配置有不同的layout文件時(如,橫向或縱向),Variables會被合并。這些layout文件之間必須不能有沖突的Variable定義。

產(chǎn)生的Binding類對于每一個描述的Variables都會有setter和getter。這些Variables會使用默認的Java值 - null(引用類型)、0(int)、false(boolean)等等,直到調(diào)用setter時。

自定義 Binding 類名稱

默認情況下,Binding類的命名是基于所述layout文件的名稱,用大寫開頭,除去下劃線()以及()后的***個字母大寫,然后添加“Binding”后綴。這個類將被放置在一個模塊封裝包里的databinding封裝包下。例如,所述layout文件contact_item.xml將生成ContactItemBinding。如果模塊包是com.example.my.app,那么它將被放置在com.example.my.app.databinding。

Binding類可通過調(diào)整data元素中的class屬性來重命名或放置在不同的包中。例如:

 
 
  1. ...

在模塊封裝包的databinding包中會生成名為ContactItem的Binding類。如果要想讓該類生成在不同的包種,你需要添加前綴.,如下:

 
 
  1. ...

在這個情況下,ContactItem類直接在模塊包種生成?;蛘吣憧梢蕴峁┱麄€包名:

 
 
  1. ...

Includes

通過使用application namespace以及在屬性中的Variable名字從容器layout中傳遞Variables到一個被包含的layout:

 
 
  1. xmlns:bind="http://schemas.android.com/apk/res-auto">
  2. android:orientation="vertical"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. bind:user="@{user}"/>
  6. bind:user="@{user}"/>

注意:在name.xml以及contact.xml兩個layout文件中必需要有user variable

表達式

常用表達式跟Java表達式很像,以下這些是一樣的:

數(shù)學 + - / * %

字符串連接 +

邏輯 && ||

二進制 & | ^

一元運算 + - ! ~

移位 >> >>> <<

比較 == > < >= <=

instanceof

分組 ()

null

Cast

方法調(diào)用

數(shù)據(jù)訪問 []

三元運算 ?:

示例:

 
 
  1. android:text="@{String.valueOf(index + 1)}"
  2. android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
  3. android:transitionName='@{"image_" + id}'

缺少的操作

this

super

new

#p#

顯式泛型調(diào)用

Null合并操作

?? - 左邊的對象如果它不是null,選擇左邊的對象;或者如果它是null,選擇右邊的對象:

android:text="@{user.displayName ?? user.lastName}"

函數(shù)上的寫法如下:

 
 
  1. android:text="@{user.displayName != null ? user.displayName : user.lastName}"

屬性引用

***個已經(jīng)在前邊提到了a)Data Binding表達式:JavaBean引用的簡短格式。

當一個表達式引用一個類的屬性,它仍使用同樣的格式對于字段、getters以及ObservableFields。

 
 
  1. android:text="@{user.lastName}"
  2. 避免 NullPointerException

Data Binding代碼生成時自動檢查是否為nulls來避免出現(xiàn)null pointer exceptions錯誤。例如,在表達式@{user.name}中,如果user是null,user.name會賦予它的默認值(null)。如果你引用user.age,age是int類型,那么它的默認值是0。

集合

常用的集合:arrays、lists、sparse lists以及maps,為了簡便都可以使用[]來訪問。

 
 
  1. "/>
  2. "/>
  3. "/>
  4. android:text="@{list[index]}"
  5. android:text="@{sparse[index]}"
  6. android:text="@{map[key]}"

字符串

當使用單引號包含屬性值時,在表達式中使用雙引號很容易:

 
 
  1. android:text='@{map["firstName"]}'

使用雙引號來包含屬性值也是可以的。字符串前后需要使用"`":

 
 
  1. android:text="@{map[`firstName`]}"
  2. android:text="@{map["firstName"]}"
  3. Resources

使用正常的表達式來訪問resources也是可行的:

android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"

格式化字符串和復數(shù)可以通過提供參數(shù)來判斷

 
 
  1. android:text="@{@string/nameFormat(firstName, lastName)}"
  2. android:text="@{@plurals/banana(bananaCount)}"

當復數(shù)需要多個參數(shù)時,所有的參數(shù)都會通過:

 
 
  1. Have an orange
  2. Have %d oranges
  3. android:text="@{@plurals/orange(orangeCount, orangeCount)}"

一些資源需要顯式類型判斷:

類型 正常引用 表達式引用

 
 
  1. String[] @array @stringArray
  2. int[] @array @intArray
  3. TypedArray @array @typedArray
  4. Animator @animator @animator
  5. StateListAnimator @animator @stateListAnimator
  6. color int @color @color
  7. ColorStateList @color @colorStateList

5. Data 對象

任何Plain old Java object(PO??JO)可用于Data Binding,但修改POJO不會導致UI更新。Data Binding的真正能力是當數(shù)據(jù)變化時,可以通知給你的Data對象。有三種不同的數(shù)據(jù)變化通知機制:Observable對象、ObservableFields以及observable collections。

當這些可觀察Data對象??綁定到UI,Data對象屬性的更改后,UI也將自動更新。

Observable 對象

實現(xiàn)android.databinding.Observable接口的類可以允許附加一個監(jiān)聽器到Bound對象以便監(jiān)聽對象上的所有屬性的變化。

Observable接口有一個機制來添加和刪除監(jiān)聽器,但通知與否由開發(fā)人員管理。為了使開發(fā)更容易,一個BaseObservable的基類為實現(xiàn)監(jiān)聽器注冊機制而創(chuàng)建。Data實現(xiàn)類依然負責通知當屬性改變時。這是通過指定一個Bindable注解給getter以及setter內(nèi)通知來完成的。

 
 
  1. private static class User extends BaseObservable {
  2. private String firstName;
  3. private String lastName;
  4. @Bindable
  5. public String getFirstName() {
  6. return this.firstName;
  7. }
  8. @Bindable
  9. public String getFirstName() {
  10. return this.lastName;
  11. }
  12. public void setFirstName(String firstName) {
  13. this.firstName = firstName;
  14. notifyPropertyChanged(BR.firstName);
  15. }
  16. public void setLastName(String lastName) {
  17. this.lastName = lastName;
  18. notifyPropertyChanged(BR.lastName);
  19. }
  20. }

在編譯期間,Bindable注解在BR類文件中生成一個Entry。BR類文件會在模塊包內(nèi)生成。如果用于Data類的基類不能改變,Observable接口通過方便的PropertyChangeRegistry來實現(xiàn)用于儲存和有效地通知監(jiān)聽器。

Observable 字段

一些小工作會涉及到創(chuàng)建Observable類,因此那些想要節(jié)省時間或者幾乎沒有幾個屬性的開發(fā)者可以使用ObservableFields。ObservableFields是自包含具有單個字段的observable對象。它有所有基本類型和一個是引用類型。要使用它需要在data對象中創(chuàng)建public final字段:

 
 
  1. private static class User extends BaseObservable {
  2. public final ObservableField firstName =
  3. new ObservableField<>();
  4. public final ObservableField lastName =
  5. new ObservableField<>();
  6. public final ObservableInt age = new ObservableInt();
  7. }

就是這樣,要訪問該值,使用set和get方法:

user.firstName.set("Google");

int age = user.age.get();

Observable 集合

一些app使用更多的動態(tài)結(jié)構來保存數(shù)據(jù)。Observable集合允許鍵控訪問這些data對象。ObservableArrayMap用于鍵是引用類型,如String。

 
 
  1. ObservableArrayMap user = new ObservableArrayMap<>();
  2. user.put("firstName", "Google");
  3. user.put("lastName", "Inc.");
  4. user.put("age", 17);

在layout文件中,通過String鍵可以訪問map:

 
 
  1. "/>
  2. android:text='@{user["lastName"]}'
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"/>
  5. android:text='@{String.valueOf(1 + (Integer)user["age"])}'
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"/>
  8. ObservableArrayList用于鍵是整數(shù):
  9. ObservableArrayList user = new ObservableArrayList<>();
  10. user.add("Google");
  11. user.add("Inc.");
  12. user.add(17);
  13. 在layout文件中,通過索引可以訪問list:

     
     
    1. "/>
    2. android:text='@{user[Fields.LAST_NAME]}'
    3. android:layout_width="wrap_content"
    4. android:layout_height="wrap_content"/>
    5. android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
    6. android:layout_width="wrap_content"
    7. android:layout_height="wrap_content"/>
    8. 6. Binding生成

    Binding類的生成鏈接了layout中variables與Views。如前面所討論的,Binding的名稱和包名可以定制。所生成的Binding類都擴展了android.databinding.ViewDataBinding。

    #p#

    創(chuàng)建

    Binding應在inflation之后就立馬創(chuàng)建,以確保View層次結(jié)構不在之前打擾layout中的binding到views上的表達式。有幾個方法可以綁定到一個layout。最常見的是在Binding類上使用靜態(tài)方法.inflate方法載入View的層次結(jié)構并且綁定到它只需這一步。還有一個更簡單的版本,只需要LayoutInflater還有一個是采用ViewGroup:

    MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);

    MyLayoutBinding binding = MyLayoutBinding.inflate(LayoutInflater, viewGroup, false);

    如果使用不同的機制載入layout,他可一分開綁定:

    MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);

    有時Binding不能提前知道,對于這種情況,可以使用DataBindingUtil類來創(chuàng)建Binding:

     
     
    1. ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater, layoutId,
    2. parent, attachToParent);
    3. ViewDataBinding binding = DataBindingUtil.bindTo(viewRoot, layoutId);

    帶ID的Views

    在layout中對于每個帶ID的View會生成一個public final字段。Binding在View層次結(jié)構上做單一的傳遞,提取帶ID的Views。這種機制比起某些Views使用findViewById還要快。例如:

     
     
    1. android:orientation="vertical"
    2. android:layout_width="match_parent"
    3. android:layout_height="match_parent">
    4. android:layout_height="wrap_content"
    5. android:text="@{user.firstName}"
    6. android:id="@+id/firstName"/>
    7. android:layout_height="wrap_content"
    8. android:text="@{user.lastName}"
    9. android:id="@+id/lastName"/>

    它會生成如下的Binding類:

    public final TextView firstName;

    public final TextView lastName;

    IDs不像沒有Data Bindings那樣幾乎沒有必要,但是仍然會有一些實例需要從代碼中訪問Views。

    Variables

    每個Variable會有訪問方法。

     
     

    它會在Binding中生成setters和getters:

     
     
    1. public abstract com.example.User getUser();
    2. public abstract void setUser(com.example.User user);
    3. public abstract Drawable getImage();
    4. public abstract void setImage(Drawable image);
    5. public abstract String getNote();
    6. public abstract void setNote(String note);

    ViewStubs

    ViewStubs跟正常的Views略有不同。他們開始時是不可見的,當他們要么設置為可見或被明確告知要載入時,它們通過載入另外一個layout取代了自己。

    由于ViewStub基本上從View的層次結(jié)構上消失,在Binding對象的View也必須消失來允許被收集。因為Views是***的,一個ViewStubProxy對象取帶ViewStub,給開發(fā)者獲得了ViewStub,當它存在以及還可以訪問載入的View層次結(jié)構時當ViewStub已被載入時。

    當載入另一個layout,為新的布局必需創(chuàng)建一個Binding。因此,ViewStubProxy必需監(jiān)聽ViewStub的OnInflateListener監(jiān)聽器并在那個時候建立Binding。因為只有一個可以存在,ViewStubProxy允許開發(fā)者在其上設置一個OnInflateListener它會在建立Binding后調(diào)用。

    Binding進階

    動態(tài)Variables

    有時,不知道具體的Binding類,例如,一個RecyclerView適配器對layouts任意操作并不知道具體的Binding類。它仍然必需在onBindViewHolder期間賦值給Binding。

    在這個例子中,該RecyclerView綁定的所有l(wèi)ayouts有一個“item”的Variable。該BindingHolder有一個getBinding方法返回ViewDataBinding。

     
     
    1. public void onBindViewHolder(BindingHolder holder, int position) {
    2. final T item = mItems.get(position);
    3. holder.getBinding().setVariable(BR.item, item);
    4. holder.getBinding().executePendingBindings();
    5. }

    直接Binding

    當一個variable或observable變化時,binding會在下一幀之前被計劃要改變。有很多次,但是在Binding時必須立即執(zhí)行。要強制執(zhí)行,使用executePendingBindings()方法。

    后臺線程

    只要它不是一個集合,你可以在后臺線程中改變你的數(shù)據(jù)模型。在判斷是否要避免任何并發(fā)問題時,Data Binding會對每個Varialbe/field本地化。

    7. 屬性Setters

    每當綁定值的變化,生成的Binding類必須調(diào)用setter方法??。Data Binding框架有可以自定義賦值的方法。

    自動Setters

    對于一個屬性,Data Binding試圖找到setAttribute方法。與該屬性的namespace并不什么關系,僅僅與屬性本身名稱有關。

    例如,有關TextView的android:text屬性的表達式會尋找一個setText(String)的方法。如果表達式返回一個int,Data Binding會搜索的setText(int)方法。注意:要表達式返回正確的類型,如果需要的話使用casting。Data Binding仍會工作即使沒有給定名稱的屬性存在。然后,您可以通過Data Binding輕松地為任何setter“創(chuàng)造”屬性。例如,DrawerLayout沒有任何屬性,但大量的setters。您可以使用自動setters來使用其中的一個。

     
     
    1. android:layout_width="wrap_content"
    2. android:layout_height="wrap_content"
    3. app:scrimColor="@{@color/scrim}"
    4. app:drawerListener="@{fragment.drawerListener}"/>

    重命名的Setters

    一些有setters的屬性按名稱并不匹配。對于這些方法,屬性可以通過BindingMethods注解相關聯(lián)。這必須與一個包含BindingMethod注解的類相關聯(lián),每一個用于一個重命名的方法。例如,android:tint屬性與setImageTintList相關聯(lián),而不與setTint相關。

     
     
    1. @BindingMethods({
    2. @BindingMethod(type = "android.widget.ImageView",
    3. attribute = "android:tint",
    4. method = "setImageTintList"),
    5. })

    以上例子,開發(fā)者需要重命名setters是不太可能了,android架構屬性已經(jīng)實現(xiàn)了。

    自定義Setters

    有些屬性需要自定義綁定邏輯。例如,對于android:paddingLeft屬性并沒有相關setter。相反,setPadding(left, top, right, bottom)是存在在。一個帶有BindingAdapter注解的靜態(tài)綁定適配器方法允許開發(fā)者自定義setter如何對于一個屬性的調(diào)用。

    Android的屬性已經(jīng)創(chuàng)造了BindingAdapters。舉例來說,對于paddingLeft:

     
     
    1. @BindingAdapter("android:paddingLeft")
    2. public static void setPaddingLeft(View view, int padding) {
    3. view.setPadding(padding,
    4. view.getPaddingTop(),
    5. view.getPaddingRight(),
    6. view.getPaddingBottom());
    7. }

    Binding適配器對其他定制類型非常有用。例如,自定義loader可以用來異步載入圖像。

    當有沖突時,開發(fā)人員創(chuàng)建的Binding適配器將覆蓋Data Binding默認適配器。

    您也可以創(chuàng)建可以接收多個參數(shù)的適配器。

     
     
    1. @BindingAdapter({"bind:imageUrl", "bind:error"})
    2. public static void loadImage(ImageView view, String url, Drawable error) {
    3. Picasso.with(view.getContext()).load(url).error(error).into(view);
    4. }
    5. app:error=“@{@drawable/venueError}”/>

    如果對于一個ImageViewimageUrl和error都被使用并且imageUrl是一個string類型以及error是一個drawable時,該適配器會被調(diào)用。

    匹配的過程中自定義namespaces將被忽略。

    你也可以為Android namespaces寫適配器。

    #p#

    8. 轉(zhuǎn)換

    對象轉(zhuǎn)換

    當從Binding表達式返回一個對象,一個setter會從自動、重命名以及自定義的setters中選擇。該對象將被轉(zhuǎn)換為所選擇的setter的參數(shù)類型。

    這是為了方便那些使用ObservableMaps來保存數(shù)據(jù)。例如:

     
     
    1. android:text='@{userMap["lastName"]}'
    2. android:layout_width="wrap_content"
    3. android:layout_height="wrap_content"/>

    在userMap返回一個對象并且該對象將自動轉(zhuǎn)換為setText(CharSequence)的參數(shù)類型。當有關參數(shù)類型可能混亂時,開發(fā)人員需要在表達式中轉(zhuǎn)換。

    自定義轉(zhuǎn)換

    有時候轉(zhuǎn)換應該是自動的在特定類型之間。例如,設置背景的時候:

     
     
    1. android:background="@{isError ? @color/red : @color/white}"
    2. android:layout_width="wrap_content"
    3. android:layout_height="wrap_content"/>

    這里,背景需要Drawable對象,但顏色是一個整數(shù)。不管何時有Drawable并且返回值是一個整數(shù),那么整數(shù)類型會被轉(zhuǎn)換為ColorDrawable。這個轉(zhuǎn)換是通過使用帶有BindingConversion注解的靜態(tài)方法完成的:

     
     
    1. @BindingConversion
    2. public static ColorDrawable convertColorToDrawable(int color) {
    3. return new ColorDrawable(color);
    4. }

    注意:轉(zhuǎn)換僅僅發(fā)生在setter級別,因此它是不允許以下混合類型:

     
     
    1. android:background="@{isError ? @drawable/error : @color/white}"
    2. android:layout_width="wrap_content"
    3. android:layout_height="wrap_content"/>

    分享題目:AndroidDataBinding用戶指南
    當前網(wǎng)址:http://www.dlmjj.cn/article/djidsio.html