1. 程式人生 > >android資料繫結框架DataBinding使用

android資料繫結框架DataBinding使用

在介紹DataBinding之前,肯定要先學會搭建使用它的環境。鑑於是2015年釋出的,現在大家androidstudio的版本估計都在1.5以上了,就在1.5的版本上搭建和介紹吧,1.5之前的大家可以在網上搜索,因為我看網上大多數是介紹的1.3的使用方法,還沒有很多對於1.5之後的環境搭建方法。

環境搭建

Android 的 Gradle 外掛版本不低於 1.5.0-alpha1:
classpath 'com.android.tools.build:gradle:1.5.0'
然後修改對應模組(Module)的 build.grade:

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

注意:Android stuido 的版本一定要大於1.3,而且Android Studio目前對binding物件沒有自動程式碼提示,只會在編譯時進行檢查。就是這麼簡單,但是1.3及以前的版本,對於環境的搭建,可能就會麻煩一點(沒事1.3的環境搭建方法,網上多得是)。

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

Binding資料

預設情況下,一個Binding類會基於layout檔案的名稱而產生,將其轉換為Pascal case(譯註:首字母大寫的命名規範)並且新增“Binding”字尾。上述的layout檔案是

activity_main.xml,因此生成的類名是ActivityMainBinding。此類包含從layout屬性到layout的Views中所有的bindings(例如user變數),並且它還知道如何給Binding表示式分配數值。建立bindings的最簡單的方式是在inflating(譯註:layout檔案與Activity/Fragment的“連結”)期間如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);
}

就是這樣,執行app後,你將會看到Test User。或者你可以通過如下獲取View:

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());

如果你在ListView或者RecyclerView adapter使用Data Binding時,你可能會使用:

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup,
false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

深入 Layout 檔案

Import

零個或多個import元素可能在data元素中使用。這些只用在你的layout檔案中新增引用,就像在Java中:

<data>
    <import type="android.view.View"/>
</data>

現在,View可以使用你的Binding表示式:

<TextView
   android:text="@{user.lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

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

<import type="android.view.View"/>
<import type="com.example.real.estate.View"
        alias="Vista"/>

這樣,在該layout檔案中Vista對應com.example.real.estate.View,而View對應android.view.View。匯入的型別可以在Variable和表示式中使用作為引用來使用:

<data>
    <import type="com.example.User"/>
    <import type="java.util.List"/>
    <variable name="user" type="User"/>
    <variable name="userList" type="List<User>"/>
 </data>

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

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

匯入的型別還可以在表示式中使用static屬性和方法:

<data>
    <import type="com.example.MyStringUtils"/>
    <variable name="user" type="com.example.User"/>
</data><TextView
   android:text="@{MyStringUtils.capitalize(user.lastName)}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

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

Variables

data中可以使用任意數量的variable元素。每一個variable元素描述了一個用於layout檔案中Binding表示式的屬性。

<data>
    <import type="android.graphics.drawable.Drawable"/>
    <variable name="user"  type="com.example.User"/>
    <variable name="image" type="Drawable"/>
    <variable name="note"  type="String"/>
</data>

Variable型別在編譯時檢查,因此如果一個Variable實現了Observableobservable collection,這應該反映在型別中。(譯註:需要查詢資料來理解)如果variable是一個沒有實現Observable介面的基本類或者介面,Variables不會被observed!

當對於多種配置有不同的layout檔案時(如,橫向或縱向),Variables會被合併。這些layout檔案之間必須不能有衝突的Variable定義。

產生的Binding類對於每一個描述的Variables都會有setter和getter。這些Variables會使用預設的Java值 - null(引用型別)、0(int)、false(boolean)等等,直到呼叫setter時。

自定義 Binding 類名稱

預設情況下,Binding類的命名是基於所述layout檔案的名稱,用大寫開頭,除去下劃線(_)以及(_)後的第一個字母大寫,然後新增“Binding”字尾。這個類將被放置在一個模組封裝包裡的databinding封裝包下。例如,所述layout檔案contact_item.xml將生成ContactItemBinding。如果模組包是com.example.my.app,那麼它將被放置在com.example.my.app.databinding

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

<data class="ContactItem">
    ...
</data>

在模組封裝包的databinding包中會生成名為ContactItem的Binding類。如果要想讓該類生成在不同的包種,你需要新增字首.,如下:

<data class=".ContactItem">
    ...
</data>

在這個情況下,ContactItem類直接在模組包種生成。或者你可以提供整個包名:

<data class="com.example.ContactItem">
    ...
</data>

Includes

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

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </LinearLayout>
</layout>

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

表示式

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

  • 數學 + - / * %

  • 字串連線 +

  • 邏輯 && ||

  • 二進位制 & | ^

  • 一元運算 + - ! ~

  • 移位 >> >>> <<

  • 比較 == > < >= <=

  • instanceof

  • 分組 ()

  • null

  • Cast

  • 方法呼叫

  • 資料訪問 []

  • 三元運算 ?:

示例:

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

缺少的操作:

  • this

  • super

  • new

  • 顯式泛型呼叫

Null合併操作

  • ?? - 左邊的物件如果它不是null,選擇左邊的物件;或者如果它是null,選擇右邊的物件:

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

函式上的寫法如下:

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

屬性引用

第一個已經在前邊提到了a)Data Binding表示式:JavaBean引用的簡短格式。

當一個表示式引用一個類的屬性,它仍使用同樣的格式對於欄位、getters以及ObservableFields。

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

避免 NullPointerException

Data Binding程式碼生成時自動檢查是否為nulls來避免出現null pointer exceptions錯誤。例如,在表示式@{user.name}中,如果user是null,user.name會賦予它的預設值(null)。如果你引用user.age,age是int型別,那麼它的預設值是0

集合

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

<data>
    <import type="android.util.SparseArray"/>
    <import type="java.util.Map"/>
    <import type="java.util.List"/>
    <variable name="list" type="List<String>"/>
    <variable name="sparse" type="SparseArray<String>"/>
    <variable name="map" type="Map<String, String>"/>
    <variable name="index" type="int"/>
    <variable name="key" type="String"/>
</data>
…
android:text="@{list[index]}"
…
android:text="@{sparse[index]}"
…
android:text="@{map[key]}"

字串

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

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

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

android:text="@{map[`firstName`]}"
android:text="@{map["firstName"]}"

Resources

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

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

格式化字串和複數可以通過提供引數來判斷

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

當複數需要多個引數時,所有的引數都會通過:

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

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

| 型別 |正常引用 | 表示式引用 |
|:-|:-|:-|
| String[] | @array | @stringArray | 
| int[] | @array | @intArray | 
| TypedArray | @array | @typedArray |
| Animator | @animator | @animator |
| StateListAnimator | @animator | @stateListAnimator |
| color int | @color | @color |
| ColorStateList | @color | @colorStateList |

5. Data 物件

任何Plain old Java object(PO​​JO)可用於Data Binding,但修改POJO不會導致UI更新。Data Binding的真正能力是當資料變化時,可以通知給你的Data物件。有三種不同的資料變化通知機制:Observable物件、ObservableFields以及observable collections

當這些可觀察Data物件​​繫結到UI,Data物件屬性的更改後,UI也將自動更新。

Observable 物件

實現android.databinding.Observable介面的類可以允許附加一個監聽器到Bound物件以便監聽物件上的所有屬性的變化。

Observable介面有一個機制來新增和刪除監聽器,但通知與否由開發人員管理。為了使開發更容易,一個BaseObservable的基類為實現監聽器註冊機制而建立。Data實現類依然負責通知當屬性改變時。這是通過指定一個Bindable註解給getter以及setter內通知來完成的。

private static class User extends BaseObservable {
   private String firstName;
   private String lastName;
   @Bindable
   public String getFirstName() {
       return this.firstName;
   }
   @Bindable
   public String getFirstName() {
       return this.lastName;
   }
   public void setFirstName(String firstName) {
       this.firstName = firstName;
       notifyPropertyChanged(BR.firstName);
   }
   public void setLastName(String lastName) {
       this.lastName = lastName;
       notifyPropertyChanged(BR.lastName);
   }
}

在編譯期間,Bindable註解在BR類檔案中生成一個Entry。BR類檔案會在模組包內生成。如果用於Data類的基類不能改變,Observable介面通過方便的PropertyChangeRegistry來實現用於儲存和有效地通知監聽器。

Observable 欄位

一些小工作會涉及到建立Observable類,因此那些想要節省時間或者幾乎沒有幾個屬性的開發者可以使用ObservableFieldsObservableFields是自包含具有單個欄位的observable物件。它有所有基本型別和一個是引用型別。要使用它需要在data物件中建立public final欄位:

private static class User extends BaseObservable {
   public final ObservableField<String> firstName =
       new ObservableField<>();
   public final ObservableField<String> lastName =
       new ObservableField<>();
   public final ObservableInt age = new ObservableInt();
}

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

user.firstName.set("Google");
int age = user.age.get();

Observable 集合

一些app使用更多的動態結構來儲存資料。Observable集合允許鍵控訪問這些data物件。ObservableArrayMap用於鍵是引用型別,如String

ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);

在layout檔案中,通過String鍵可以訪問map:

<data>
    <import type="android.databinding.ObservableMap"/>
    <variable name="user" type="ObservableMap<String, Object>"/>
</data><TextView
   android:text='@{user["lastName"]}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>
<TextView
   android:text='@{String.valueOf(1 + (Integer)user["age"])}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

ObservableArrayList用於鍵是整數:

ObservableArrayList<Object> 
            
           

相關推薦

android資料框架DataBinding使用

在介紹DataBinding之前,肯定要先學會搭建使用它的環境。鑑於是2015年釋出的,現在大家androidstudio的版本估計都在1.5以上了,就在1.5的版本上搭建和介紹吧,1.5之前的大家可以在網上搜索,因為我看網上大多數是介紹的1.3的使用方法,還沒有很多對於1

Android資料框架DataBinding,堪稱解決介面邏輯的黑科技

去年穀歌 I/O大會上介紹了一個非常厲害的新框架DataBinding, 資料繫結框架給我們帶來了很大的方便,以前我們可能需要在每個Activity裡寫很多的findViewById,不僅麻煩,還增加了程式碼的耦合性,如果我們使用DataBinding,就可以拋棄那麼

Android資料框架DataBinding用法

    2)繫結Variable      雖然在佈局檔案中對應上了,但是值是怎麼傳進去的呢?這就是我們要將的Activity中的那兩行程式碼了,它把實體類和佈局檔案進行了繫結。修改MainActivity中的onCreate,用 DatabindingUtil.setContentView() 來替換掉 s

Android官方資料框架DataBinding

轉自:http://blog.csdn.net/qibin0506/article/details/47393725 今天來了解一下android最新給我們帶來的資料繫結框架——Data Binding Library。資料繫結框架給我們帶來了更大的方便性,以前我們可能

Android官方資料框架DataBinding(一)

從這篇部落格開始,我們就來了解一下android最新給我們帶來的資料繫結框架——Data Binding Library。資料繫結框架給我們帶來了更大的方便性,以前我們可能需要在Activity裡寫很多的findViewById,煩人的程式碼也增加了我們程式

Android官方資料框架DataBinding用法詳解+附帶DEMO原始碼

今天來了解一下Android最新給我們帶來的資料繫結框架——Data Binding Library。資料繫結框架給我們帶來了更大的方便性,以前我們可能需要在Activity裡寫很多的findViewById,煩人的程式碼也增加了我們程式碼的耦合性,現在我們馬上就

android MVVM DataBinding 資料框架 注意問題

英文官方參考資料(牆):https://developer.android.com/topic/libraries/data-binding/index.html 博文參考資料1(較新,推薦):http://blog.csdn.net/guyuealian/article/

來自官方的Android資料(Data Binding)框架

資料物件 任何的POJO 物件都可以用作資料繫結,但是修改一個 POJO 物件不會更新 UI。 資料繫結的威力在於,賦予資料物件在資料改變的時候通知其他元件的能力。有三種資料改變通知機制:Observable 物件、ObservableFields 和 observa

Android 官方資料框架 Data Binding 簡單使用

參考資料 配置 Data Binding 環境 在需要使用 Data Binding 的 module 里加上如下配置: android { .... dataBinding { enabled = t

資料技術-databinding

    公司平臺研發過程需要使用databinding資料繫結技術,就小小的總結了一下,希望能幫助有需要的朋友,廢話少說,直接進入正題。 資料繫結技術,是用來解決模型和UI元素之間重複的賦值和取值的繁

Android開發-資料-DataBinding-AndroidStudio(三)多組資料

多組資料繫結方式,使用include~~ MainActivity.java: package com.iwanghang.databinding; import android.databinding.DataBindingUtil; import android

Android開發-資料-DataBinding-AndroidStudio(一)初識DataBinding

效果上沒有什麼特別的,看不出來什麼~~ 看看準備工作和原始碼: MainActivity.java: package com.iwanghang.databinding; import an

Vue 框架-03-鍵盤事件、健值修飾符、雙向資料

Vue 框架-03-鍵盤時間及健值修飾符 一、鍵盤事件,當按鍵盤時,在控制檯輸出提示 html 原始碼: <!DOCTYPE html> <html> <head> <meta charset="utf-8" />

Android Data Binding(資料)使用者指南

轉自:https://www.jianshu.com/p/b1df61a4df77 1. 介紹 這篇文章介紹瞭如何使用Data Binding庫來寫宣告的layouts檔案,並且用最少的程式碼來繫結你的app邏輯和layouts檔案。Data Binding庫不僅靈活而且廣泛相容-

Vue 框架的v-model 雙向資料

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <meta name="viewport" content="width=device-

Android(或者Java)通過HttpUrlConnection向SpringMVC請求資料資料

問題描述     當我們使用SpringMVC作為服務端的框架時,有時不僅僅要應對web前端(jsp、javascript、Jquery等)的訪問請求,有時還可能需要響應Android和JavaSE(桌面應用)這些客戶端的請求,因此,除了web使用form表單

android例項 listview與sqlite資料

ListView與Sqlite資料庫繫結步驟: 1.將Sqlite資料庫的內容查詢出來並放入陣列列表中,形成ListView的資料來源; 2.介面卡繫結資料來源,顯示在ListView item中。 本文實現的ListView與Sqlite資料繫結的功能如下圖-1

JS框架雙向資料原理及思考

本文章資訊點 雙向資料繫結原理(vue) 如何設計搭建自己的框架 程式碼暫略,詳見,github [地址]https://github.com/yyccmmkk/Bi-directionalDataBindingDemo 什麼是單向什麼是雙向? 單向指是資料從mod

DataBinding資料)入門篇

引言: DataBinding是2015年穀歌I/O上提出來的,從字面意思上看就是資料繫結,實際上就是將資料繫結在xml中,並實現及時重新整理,聽起來就碉堡了,再也沒有了findviewbyId,雖然現在很多註解框架也能實現無findviewbyId,但是這樣

jface databinding:使用CheckboxTableViewer實現表中(Set)物件與CheckTable中選中條目資料

上一篇博文《jface databinding:可多選的widget List元件selection專案與java.util.List物件的雙向資料繫結》講述瞭如何實現List元件的多選項與List資料繫結的問題。 實際使用中覺得用List元件來給使用者做多選