摘要:使用數據綁定可以在的布局文件中就用對象指定其顯示的內容。由代碼可知,類中所有域均被編入被觀察者列表中,這有時并不合理。為了靈活起見,可以使用多帶帶對某個引用域進行轉換,使用等對基本類型進行轉換。
Data Binding是Android待發布的支持庫,它可以將邏輯和代碼關聯起來,避免開發者書寫大量的膠合代碼,也是實現MVVM架構的必要技術。
此前,布局文件XML被認為是相對靜態的,往往需要在Java代碼中處理與其有關的邏輯;數據綁定技術(Data Binding)改造了布局文件使其能夠導入Java類,定義和使用變量,具備像Java代碼一樣的靈活性,從而使得XML文件變的更加動態化,支持更強大的功能。
添加依賴在項目頂層的gradle中添加依賴
dependencies { classpath "com.android.tools.build:gradle:1.2.3" classpath "com.android.databinding:dataBinder:1.0-rc0" }
在具體模塊gradle配置文件中啟用該插件
apply plugin: "com.android.databinding"使用示例
給出一個Model層的User類
public class User { public final String firstName; public final String lastName; //get&set .... }
在View層使用一個TextView專門負責顯示User的兩個名字。
在一般的實現中,TextView和User類往往都在Activity中實例化,并實現交互邏輯。在MVP架構中,專門設立主導器P負責交互邏輯,并將User類的實例化從Activity中移出。
使用數據綁定可以在TextView的布局文件中就用User對象指定其顯示的內容。這個布局文件databinding_layout.xml如下
//1.根標簽為 layout//2.data標簽定義所使用數據域對象 //3.variable標簽根據Java類建立變量 //4.靜態布局
布局文件中定義了數據層user和視圖層textview的對應關系,但要傳入的對象user還需要在Java代碼中生成;同時這個布局文件將按名稱生成一個DatabindingLayoutBinding類,位于appuildintermediatesclassesdebug<包名>databinding目錄下,需要在Java代碼中作為布局載入;而后將二者綁定起來。
//1.載入新布局類 DatabindingLayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.databinding_layout); //2.產生User對象 User user = new User("liu", "xiangtian"); //3.綁定布局和具體對象 binding.setUser(user);更多用法
布局文件中data可以像Java代碼一樣導入類,并直接使用其類靜態變量/方法,使用variable標簽聲明和建立對象;
類和對象的域/方法均可以在布局文件中使用,也支持相關運算,如上例中的字符連接符+。
觀察者模式上述僅是數據綁定的基本功能,如果User對象一被改變,布局界面就自動更新,數據綁定才顯得名副其實。其實現很容易讓人聯想到觀察者模式,User對象繼承Observable作為被觀察者,但問題是這種實現更新需要主動使用notify函數來通知觀察者們;為此,android使用BaseObservable類和Bindable注解實現自動通知。
要改的僅僅是User類。
//1.繼承BaseObservable類成為被觀察者 public class User extends BaseObservable{ public String firstName; //2.給get方法Bindable注解 @Bindable public String getFirstName() { return firstName; } //3.給set方法添加`notify`方法 public void setLastName(String lastName) { this.lastName = lastName; notifyPropertyChanged(BR.lastName); } }
BR亦是編譯時生成類,同樣位于appuildintermediatesclassesdebug<包名>目錄下,其內容是:
public class BR { public static final int _all = 0; public static final int firstName = 1; public static final int lastName = 2; public static final int user = 3; }
此后當使用user.setFirstName("li")更改數據后,布局中將相應變化。
由BR代碼可知,User類中所有域均被編入被觀察者列表中,這有時并不合理。為了靈活起見,可以使用ObservableFields多帶帶對某個引用域進行轉換,使用ObservableInt等對基本類型進行轉換。
依然改User類
public class User { public ObservableFieldfirstName = new ObservableField<>(); public ObservableField lastName = new ObservableField<>(); }
在Java代碼中初始化User
User user = new User(); //ObservableField是一個包裝類,提供get/set方法處理包裝的內容對象 user.firstName.set("liu"); user.lastName.set("xiangtian");
綁定關系類布局文件仍然使用@{user.firstName}即可,不需要使用@{user.firstName.get}
生成的新布局文件是一個代表綁定關系的類DatabindingLayoutBinding,這個類繼承自ViewDataBinding,其中包含所有在布局中聲明了的類對象 和 參與綁定的全部View,并提供了相應了set/get方法以及解除所有綁定的unbind方法。如示例中
// views private final android.widget.LinearLayout mboundView0; private final android.widget.TextView mboundView1; // variables private com.example.migratingtest.User mUser;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64752.html
摘要:由于長期苦惱于第三方庫選擇的廣大開發者而言,這也是谷歌為我們提供的一盞明燈。手機淘寶構架演化實踐淘寶相信都不陌生了從年開始,從萬增長到超過億,面臨的問題包括研發支撐所需要解決的事情各不相同。 ...
摘要:是的工具庫,它內部封裝了諸多對字符串數組對象等常見數據類型的處理函數,其中部分是目前尚未制訂的規范,但同時被業界所認可的輔助函數。前端框架簡介是當下較為流行的一個框架,它是以數據驅動和組件化的思想構建的。框架是的核心,它是一個實例。 1、js運行機制 javascript是一門單線程語言同步和異步任務分別進入不同的執行場所,同步的進入主線程,異步的進入Event Table并注冊函數。...
摘要:今天,為了讓大家的項目優雅升級,快速接入,給你帶來一份豐盛的遷移指南目錄結構和微信小程序一樣,包含一個描述整體程序的和多個描述各自頁面的。 cml 作為真正讓一套代碼運行多端的框架,提供標準的MVVM模式,統一開發各類終端。 同時,擁有各端獨立的 運行時框架(runtime)、數據管理(store)、組件庫(ui)、接口(api)。 此外,cml在跨端能力加強、能力統一、表現一致等方面...
摘要:將注意力集中保持在核心庫,而將其他功能如路由和全局狀態管理交給相關的庫。此示例使用類似的語法,稱為。執行更快,因為它在編譯為代碼后進行了優化。基于的模板使得將已有的應用逐步遷移到更為容易。 前言 因為沒有明確的界定,這里不討論正確與否,只表達個人對前端MV*架構模式理解看法,再比較React和Vue兩種框架不同.寫完之后我知道這文章好水,特別是框架對比部分都是別人說爛的,而我也是打算把...
摘要:原文博客地址如何理解如何實現是否解讀過的源碼與框架的區別實現實現獨立初始化實例兩者的區別數據和視圖的分離,解耦開放封閉原則,對擴展開放,對修改封閉在中在代碼中操作視圖和數據,混在一塊了以數據驅動視圖,只關心數據變化, 原文博客地址:https://finget.github.io/2018/05/31/mvvm-vue/ MVVM 如何理解 MVVM 如何實現 MVVM 是否解讀過 ...
閱讀 562·2023-04-26 02:59
閱讀 695·2023-04-25 16:02
閱讀 2162·2021-08-05 09:55
閱讀 3568·2019-08-30 15:55
閱讀 4660·2019-08-30 15:44
閱讀 1804·2019-08-30 13:02
閱讀 2201·2019-08-29 16:57
閱讀 2292·2019-08-26 13:35