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實現了Observable或observable
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(POJO)可用於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類,因此那些想要節省時間或者幾乎沒有幾個屬性的開發者可以使用ObservableFields
。ObservableFields
是自包含具有單個欄位的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元件來給使用者做多選