android mvvm 官方例子,詳解Android的MVVM框架 - 數據綁定

本教程是跟著 Data Binding Guide學習過程中得出的一些實踐經驗,同時修改了官方教程的一些錯誤,每一個知識點都有對應的源碼,爭取做到實踐與理論相結合。

Data Binding 解決了 Android UI 編程中的一個痛點,官方原生支持 MVVM 模型可以讓我們在不改變既有代碼框架的前提下,非常容易地使用這些新特性。其實在此之前,已經有些第三方的框架可以支持 MVVM 模型,無耐由于框架的侵入性太強,導致一直沒有流行起來。

準備

Android Studio 更新到 1.3 版本

打開 Preferences,找到 Appearances & Behavior 下的 Updates 選項,把 Automatically Check updates for 修改成 Canary Channel。

8c5fa1a3457f693e36f011f74f89931a.png

注意

Data Binding 是一個 support 包,因此與 Android M 沒什么關系,可以不用下載 Android MNC Preview 的 SDK。

新建一個 Project

修改 Project 的 build.gradle,為 build script 添加一條依賴,Gradle 版本為 1.2.3。

classpath 'com.android.tools.build:gradle:1.2.3'

classpath 'com.android.databinding:dataBinder:1.0-rc0'

為用到 Data Binding 的模塊添加插件,修改對應的 build.gradle。

apply plugin: 'com.android.databinding'

注意

如果 Module 用到的 buildToolsVersion 高于 22.0.1,比如 23 rc1,那 com.android.databinding:dataBinder 的版本要改為 1.3.0-beta1,否則會出現如下錯誤:

55a1c99970e0d3b171c7fbcbda931560.png

基礎

工程創建完成后,我們通過一個最簡單的例子來說明 Data Binding 的基本用法。

布局文件

使用 Data Binding 之后,xml的布局文件就不再單純地展示 UI 元素,還需要定義 UI 元素用到的變量。所以,它的根節點不再是一個 ViewGroup,而是變成了 layout,并且新增了一個節點 data。

....

要實現 MVVM 的 ViewModel 就需要把數據與UI進行綁定,data 節點就為此提供了一個橋梁,我們先在 data 中聲明一個 variable,這個變量會為 UI 元素提供數據(例如 TextView 的 android:text),然后在 Java 代碼中把”后臺”數據與這個 variable 進行綁定。

如果要用一個表格來展示用戶的基本信息,用 Data Binding 應該怎么實現呢?

數據對象

添加一個 POJO 類 - User,非常簡單,四個屬性以及他們的 getter 和 setter。

public class User {

private final String firstName;

private final String lastName;

private String displayName;

private int age;

public User(String firstName, String lastName) {

this.firstName = firstName;

this.lastName = lastName;

}

public User(String firstName, String lastName, int age) {

this(firstName, lastName);

this.age = age;

}

public int getAge() {

return age;

}

public String getFirstName() {

return firstName;

}

public String getLastName() {

return lastName;

}

public String getDisplayName() {

return firstName + " " + lastName;

}

public boolean isAdult() {

return age >= 18;

}

}

稍后,我們會新建一個 User 類型的變量,然后把它跟布局文件中聲明的變量進行綁定。

定義 Variable

再回到布局文件,在 data 節點中聲明一個變量 user。

其中 type 屬性就是我們在 Java 文件中定義的 User 類。

當然,data 節點也支持 import,所以上面的代碼可以換一種形式來寫。

然后我們剛才在 build.gradle 中添加的那個插件 - com.android.databinding會根據xml文件的名稱 Generate 一個繼承自 ViewDataBinding 的類。

例如,這里 xml 的文件名叫 activity_basic.xml,那么生成的類就是 ActivityBasicBinding。

注意

java.lang.* 包中的類會被自動導入,可以直接使用,例如要定義一個 String 類型的變量:

綁定 Variable

修改 BasicActivity 的 onCreate 方法,用 DatabindingUtil.setContentView() 來替換掉 setContentView(),然后創建一個 user 對象,通過 binding.setUser(user) 與 variable 進行綁定。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityBasicBinding binding = DataBindingUtil.setContentView(

this, R.layout.activity_basic);

User user = new User("fei", "Liang");

binding.setUser(user);

}

注意

ActivityBasicBinding 類是自動生成的,所有的 set 方法也是根據 variable 名稱生成的。例如,我們定義了兩個變量。

那么就會生成對應的兩個 set 方法。

setFirstName(String firstName);

setLastName(String lastName);

使用 Variable

數據與 Variable 綁定之后,xml 的 UI 元素就可以直接使用了。

android:layout_width="wrap_content"

android:layout_height="wrap_content"

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

至此,一個簡單的數據綁定就完成了,可參考完整代碼

高級用法

使用類方法

首先為類添加一個靜態方法

public class MyStringUtils {

public static String capitalize(final String word) {

if (word.length() > 1) {

return String.valueOf(word.charAt(0)).toUpperCase() + word.substring(1);

}

return word;

}

}

然后在 xml 的 data 節點中導入:

使用方法與 Java 語法一樣:

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@{StringUtils.capitalize(user.firstName)}" />

類型別名

如果我們在 data 節點了導入了兩個同名的類怎么辦?

這樣一來出現了兩個 User 類,那 user 變量要用哪一個呢?不用擔心,import 還有一個 alias 屬性。

Null Coalescing 運算符

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

就等價于

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

屬性值

通過 ${} 可以直接把 Java 中定義的屬性值賦值給 xml 屬性。

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

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

使用資源數據

這個例子,官方教程有錯誤,可以參考Android Data Binder 的一個bug,完整代碼在此。

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

android:background="@android:color/black"

android:textColor="@android:color/white"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello_world" />

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278915.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VS2015 代碼左縮進

TabShift轉載于:https://www.cnblogs.com/527289276qq/p/8027882.html

mac設置文件權限_如何在Mac上設置文件權限

mac設置文件權限Like all major operating systems, macOS allows you to restrict access to files using a complex set of file permissions. You can set these yourself using the Finder app, or by using the chmod command in your Mac’s terminal. Here’s how. 與所…

Discrete Log Algorithms :Baby-step giant-step

離散對數的求解 1.暴力 2.Baby-step giant-step 3.Pollard’s ρ algorithm …… 下面搬運一下Baby-step giant-step 的做法 這是在 https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/discrete-log/discrete-log/ 上看到的,比較容易理解。 而且,…

Android添加item動畫,RecyclerView基礎篇-Item添加動畫

Android_Banner.jpg簡介本節中我們介紹下給RecyclerView中的Item添加動畫。添加的動畫,分為,在打開列表時有Item的展示動畫,當滑動的時候沒有動畫和打開列表滑動時有動畫兩種實現過程實現一個列表效果如下Screenshot_2020-09-01-17-03-35-349…

Oracle數據庫查詢用 where in 查詢的項超過1000條的解決方案

眾所周知,如果我們的用SQL查詢語句時,如果用where in帶的參數超過1000條的話,oracle是會報錯的。 因為項目中遇到這樣的問題,所以找到了接下來我要說的這個辦法。 因為用的地方很多,所以我把這個封裝成了一個方法。 //…

geek_Ask How-To Geek:營救受感染的PC,安裝無膨脹iTunes和馴服瘋狂的觸控板

geekYou’ve got questions and we’ve got answers. Today we highlight how to save your computer if it’s so overrun by viruses and malware you can’t work from within Windows, install iTunes without all the bloat, and tame a hyper-sensitive trackpad. 您有問…

第1課:接口測試和jmeter總結

接口測試 1. 接口的分類:webService和http api接口1) webService接口:是按照soap協議通過http傳輸,請求報文和返回報文都是xml格式,一般要借助工具來測試接口;2) http api接口:是按照…

android 工作日,如何在Android上重復警報工作日

小編典典請嘗試此代碼。已在我的應用中成功運行if (chk_monday.isChecked()) {forday(2);} else if (chk_tuesday.isChecked()) {forday(3);} else if (chk_wednesday.isChecked()) {forday(4);} else if (chk_thursday.isChecked()) {forday(5);} else if (chk_friday.isCheck…

hdu4419

對于這類面積覆蓋的題,大致就兩點要注意的 1.同一把矩形放在笛卡爾坐標系上做 2.pushup函數要注意下細節:及在統計子區間和之前要先判斷是否有子區間 用sum數組來保存區間被覆蓋的情況,如果遇到多次覆蓋問題,那就開多個sum數組分別保存被覆蓋…

最簡單 - 單例模式

public class Person {// Person 引用private static Person p null;static {if (p null) {p new Person();}}/***單例模式獲取Person對象. * return*/public static Person getInstance(){return p;} ?} 復制代碼轉載自: 簡書 - 低至一折起 文章:w…

極客時間和極客學院_極客歷史記錄的本周:Twitter的誕生,OS X十周年以及太空停留時間最長的時代即將結束...

極客時間和極客學院Every week we bring you interesting trivia and milestones from the archives of Geekdom. Today we’re taking a peek at the birth of Twitter, ten years of Mac OS X, and the longest space stay in history. 每周,我們都會為您帶來有趣…

Android風格ppt,Material Design風格的快手PPT

突發奇想,感覺MD風格既然適合 Android 軟件的界面,那么在一般PPT 演示中,效果當也是不錯。于是在網上去尋了幾處制作貼,也簡單看了 MD 設計指南的幾處要點。先試試一番再說。關于 MD 設計指南和幾處制作貼,我會把鏈接貼…

11月16日站立會議

今天是沖刺階段的第二天,我今天做了統計在線人數模塊的編寫而且對其進行了測試并修改完成,為團隊制作了今日的燃盡圖。 明天我要完成服務器端可以斷開所有用戶連接的一個小模塊和繼續為團隊制作燃盡圖。 今天遇到的困難是用Java進行編寫時,出…

iOS核心動畫高級技術(十三) 高效繪圖

More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason—including blind stupidity. 不必要的效率考慮往往是性能問題的萬惡之源。 ——William Allan Wulf #軟件繪圖 術語繪圖通常在Core Anima…

dropbox鏈接過期_詢問操作方法:“開始”菜單中的Dropbox,了解符號鏈接和翻錄TV系列DVD...

dropbox鏈接過期This week we take a look at how to incorporate Dropbox into your Windows Start Menu, understanding and using symbolic links, and how to rip your TV series DVDs right to unique and high-quality episode files. 本周,我們來看看如何將D…

android listpreference 自定義,Android – 我的ListPreference中的自定義行布局

在我的Android應用程序中,我實現了從ListPreference擴展的類SubtitleColorListPreference.我需要這個,因為我需要為列表中的每個項目設置自己的布局.一切正常,它看起來像這樣:重要的代碼是onPrepareDialogBu??ilder(AlertDialog.Builder builder)中的方法,我在其中…

springMVC3學習(十一)--文件上傳CommonsMultipartFile

版權聲明:本文為博主原創文章,未經博主同意不得轉載。 https://blog.csdn.net/itmyhome/article/details/27976873 使用springMVC提供的CommonsMultipartFile類進行讀取文件須要用到上傳文件的兩個jar包 commons-logging.jar、commons-io-xxx.jar1、在sp…

基于React和SpringBoot的快速開發模板QuickAdmin

經過一段時間的總結和完善,我的管理系統快速開發模板已經基本成型,現在GitHub上開源啦: QuickAdmin QuickAdmin是基于Spring Boot和React.js實現的管理系統開發框架。用于開發網站的后臺管理系統。 本框架提供了如下功能: 完整的基…

android sim iso,android – 意外的telephonyManager.getSimCountryIso()行為

您可以使用MCC MNC獲取SIM卡國家/地區,它是SIM配置的,與您所在的網絡無關.Configuration config getResources().getConfiguration();int countryCode config.mcc;您可以在此處找到MCC列表MccTable.java例如,西班牙是214,法國是208MCC should work on all GSM devices with S…

火狐 增強查找工具欄_在“提示”框中:簡單的IE至Firefox同步,輕松的Windows工具欄和識別USB電纜...

火狐 增強查找工具欄() Every week we tip into our mail bag and share great tips from your fellow readers. This week we’re looking at an easy way to sync your bookmarks between IE and Firefox, using simple Windows toolbars, and a clever way to ID USB cables…