玩轉Android之MVVM開發模式實戰,炫酷的DataBinding!
C# 很早就有了MVVM的開發模式,Android手機中的MVVM一直到去年Google的I\O大會上才推出,姍姍來遲。MVVM這中開發模式的優點自不必多說,可以實現檢視和邏輯程式碼的解耦,而且,按照Google的說法,使用了MVVM的開發模式,還可以提高佈局檔案的解析速度,個人覺得這一點非常重要。我們在安卓開發中經常需要寫很多個findViewById,讓人心煩,很多人不想寫這個於是用了一些註解框架,可是註解框架無論效能多好,效率總是要低於findViewById的,因此,Android中的MVVM也即databinding可以幫助我們徹底解決這個問題。OK,廢話不多說,我們來看看具體要怎麼在Android開發中使用MVVM。
在低版本的AndroidStudio中使用DataBinding稍微有點麻煩,這裡不做介紹。我這裡以AndroidStuido2.1為例來介紹DataBinding。本文主要包含以下幾方面內容:
1.基本使用
2.繫結ImageView
3.繫結ListView
4.點選事件處理
5.資料更新處理
好了,那就開始吧!
1.基本使用
建立好一個Android Project之後,在gradle檔案中新增如下幾行程式碼,表示開啟databinding:
- android {
- ...
- ...
- ...
- dataBinding{
- enabled true
- }
- }
就是這麼簡單,一個簡單的databinding配置之後,就可以開始使用資料綁定了。
要使用資料繫結,我們得首先建立一個實體類,比如User實體類,如下:
- /**
- * Created by 王鬆 on 2016/7/31.
- */
- publicclass UserEntity {
- private String username;
- private String nickname;
- privateint age;
- public UserEntity() {
- }
- publicint getAge() {
- return age;
- }
- publicvoid setAge(int age) {
- this.age = age;
- }
- public String getNickname() {
- return nickname;
- }
- publicvoid setNickname(String nickname) {
- this.nickname = nickname;
- }
- public String getUsername() {
- return username;
- }
- publicvoid setUsername(String username) {
- this.username = username;
- }
- public UserEntity(int age, String nickname, String username) {
- this.age = age;
- this.nickname = nickname;
- this.username = username;
- }
- }
然後我們來看看佈局檔案該怎麼寫,首先佈局檔案不再是以傳統的某一個容器作為根節點,而是使用<layout></layout>作為根節點,在<layout>節點中我們可以通過<data>節點來引入我們要使用的資料來源,如下:
- <?xml version="1.0" encoding="utf-8"?>
- <layout
- xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <data>
- <variable
- name="user"
- type="org.lenve.databinding1.UserEntity"/>
- </data>
- <LinearLayout
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context="org.lenve.databinding1.MainActivity">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{user.username}"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{user.nickname}"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{String.valueOf(user.age)}"/>
- </LinearLayout>
- </layout>
在data中定義的variable節點,name屬性表示變數的名稱,type表示這個變數的型別,例項就是我們實體類的位置,當然,這裡你也可以換一種寫法,如下:
- <data>
- <import type="org.lenve.databinding1.UserEntity"/>
- <variable
- name="user"
- type="UserEntity"/>
- </data>
先使用import節點將UserEntity匯入,然後直接使用即可。但是如果這樣的話又會有另外一個問題,假如我有兩個類都是UserEntity,這兩個UserEntity分屬於不同的包中,又該如何?看下面:
- <data>
- <import type="org.lenve.databinding1.UserEntity" alias="Lenve"/>
- <variable
- name="user"
- type="Lenve"/>
- </data>
在import節點中還有一個屬性叫做alias,這個屬性表示我可以給該類取一個別名,我給UserEntity這個實體類取一個別名叫做Lenve,這樣我就可以在variable節點中直接寫Lenve了。
看完data節點我們再來看看佈局檔案,TextView的text屬性被我直接設定為了@{user.username},這樣,該TextView一會直接將UserEntity實體類的username屬性的值顯示出來,對於顯示age的TextView,我用了String.valueOf來顯示,因為大家知道TextView並不能直接顯示int型資料,所以需要一個簡單的轉換,事實上,我們還可以在{}裡邊進行一些簡單的運算,這些我一會再說。
最後,我們來看看Activity中該怎麼寫,setContentView方法不能夠再像以前那樣來寫了,換成下面的方式:
- DataBindingUtil.setContentView(this, R.layout.activity_main)
該方法有一個返回值,這個返回值就是系統根據我們的activity_main.xml佈局生成的一個ViewModel類,所以完整寫法如下:
- ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
有了ViewModel,再把資料繫結上去就可以了,如下:
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
- UserEntity user = new UserEntity();
- user.setAge(34);
- user.setUsername("zhangsan");
- user.setNickname("張三");
- activityMainBinding.setUser(user);
- }
執行,顯示效果如下:
OK,那我們剛才還說到可以在@{}進行簡單的計算,都有哪些計算呢?我們來看看:
1.基本的三目運算
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{user.username??user.nickname}"/>
兩個??表示如果username屬性為null則顯示nickname屬性,否則顯示username屬性。
2.字元拼接
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{`username is :`+user.username}"/>
大家注意,這裡的字元拼接不是用單引號哦,用的是ESC按鍵下面那個按鍵按出來的。目前DataBinding中的字元拼接還不支援中文。
3.根據資料來決定顯示樣式
- <TextView
-
相關推薦
玩轉Android之MVVM開發模式實戰,炫酷的DataBinding!
C# 很早就有了MVVM的開發模式,Android手機中的MVVM一直到去年Google的I\O大會上才推出,姍姍來遲。MVVM這中開發模式的優點自不必多說,可以實現檢視和邏輯程式碼的解耦,而且,按照Google的說法,使用了MVVM的開發模式,還可以提高佈局檔案的解析速度,
玩轉Android之如何處理返回按鈕
Android和iPhone什麼的手機在按鍵上有一個很大的區別就是Android的手機有返回按鈕。今天就來講一下這個返回按鈕。這個問題處理不好後面會遇到些許的麻煩。 捕獲返回按鈕事件 首先建立一個我們今天要用的APP專案,然後給專案中新增兩個Activi
玩轉Android之二維碼生成與識別
二維碼,我們也稱作QRCode,QR表示quick response即快速響應,在很多App中我們都能見到二維碼的身影,最常見的莫過於微信了。那麼今天我們就來看看怎麼樣在我們自己的App中整合二維碼的掃描與生成功能。OK,廢話不多說,我們就開始做吧。二維碼的使用我主要想分為兩
玩轉Android之Drawable的使用
Drawable天天用,可你是否對Drawable家族有一個完整的認知?今天我們就來系統的學習一下Drawable的使用。1.概述用過Drawable的筒子都知道Drawable有很多種,有的時候Drawable是一張圖片,有的時候Drawable是我們通過顏色構造出來的某種
玩轉Android之Picasso使用詳詳詳詳詳詳解,從入門到原始碼剖析!!!!
Picasso是Squareup公司出的一款圖片載入框架,能夠解決我們在Android開發中載入圖片時遇到的諸多問題,比如OOM,圖片錯位等,問題主要集中在載入圖片列表時,因為單張圖片載入誰都會寫。如果我們想在ListView或者GridView或者RecyclerView中
玩轉Android monkey之monkey小實戰
手機app測試 monkey 自動化測試 小強測試品牌 測試幫日記 環境介紹l 模擬器裏安裝手機百度APPl 本機通過monkey命令進行隨機測試l 所有的命令均在cmd命令模式下輸入執行過程語法:adb shell monkey -p 包名 隨機事件次數,如下圖PS:每個人的環境不一樣,
【Android遊戲開發十七】讓玩家自定義手勢玩轉Android遊戲!—Android Gesture之【輸入法手勢技術】
原創,轉載務必在明顯處註明:轉載自 原文連結: http://www.himigame.com/android-game/340.html很多童鞋說我的程式碼執行後,點選home或者back後會程式異常,如果你也這樣遇到過,那麼你肯定沒有仔細讀完Himi的博文,第十九篇Him
玩轉Android Camera開發(二):使用TextureView和SurfaceTexture預覽Camera 基礎拍照demo
處理 pict all sans 格式 facet ace ets nth Google自Android4.0出了TextureView。為什麽推出呢?就是為了彌補Surfaceview的不足。另外一方面也是為了平衡GlSurfaceView。當然這是本人揣度的。關於Te
玩轉Android monkey之monkey是啥?monkey=猴子?
android monkey 手機app測試 小強測試品牌 測試幫日記 自動化測試 引子從本次開始小編將帶你學習Android monkey的用法,我們仍然保持盡可能簡潔明了的告訴大家。也歡迎大家有好文章投稿給我們,有紅包獎勵哦。投稿郵箱:[email protected],備註投稿monk
玩轉Android monkey之環境配置和ADB命令
手機app測試 monkey 小強測試品牌 測試幫日記 轉發是對小編的最大支持接著上篇文章繼續《玩轉Android monkey之monkey是啥?monkey=猴子?》配置SDKl 新建一個系統環境變量:ANDROID_HOMEl 對應的值為你sdk的安裝目錄l 編輯系統環境變量:PATHl
玩轉Android Camera開發 四 預覽介面四周暗中間亮,只拍攝矩形區域圖片 附完整原始碼
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
玩轉 Android MediaPlayer之視訊預載入 優化
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
iOS開發之(玩轉藍芽)不看此文,枉做開發
前言: 之前詳細談過不少關於HTTP協議的知識點,TCP/IP也通過tcpdump做過簡單的介紹,但網路協議的本質其實是連線,裝置或者端之間連線的方式有多種,常見的http或者基於tcp的socket只是森林一葉,還有些不那麼常見的協議比如藍芽。適當腦洞,也能玩出不少新花樣
玩轉Android Camera開發 五 基於Google自帶演算法實時檢測人臉並繪製人臉框 網路首發 附完整demo
本文主要介紹使用Google自帶的FaceDetectionListener進行人臉檢測,並將檢測到的人臉用矩形框繪製出來。本文程式碼基於PlayCameraV1.0.0,在Camera的open和preview流程上進行了改動。原先是放在單獨執行緒裡,這次我又把它放到
玩轉Android Camera開發(一):Surfaceview預覽Camera,基礎拍照功能完整demo
雜家前文是在2012年的除夕之夜倉促完成,後來很多人指出了一些問題,瑣事纏身一直沒有進行升級。後來隨著我自己的使用,越來越發現不出個升級版的demo是不行了。有時候就連我自己用這個demo測一些效能、功能點,用著都不順手。當初程式碼是在linux下寫的,弄到windows裡下
玩轉GIT之git個人快捷鍵設定和方法【極大提高git-flow開發效率】
祕訣 我使用的是git bash,環境是windows,一般是沒有.bashrc檔案的用cd ~進入使用者目錄,後在此目錄下建立 .bashrc檔案,命令如下: touch .bashrc 然後 vim .bashrc 然後按下 i 進入編輯模
android 玩轉ContentProvider之二--實現多個ContentProvider對多張表進行操作
本人原創作品,謝絕轉載! 其它地方跟一個ContentProvider操作一張表都是一樣的,唯一區別是authority,在宣告的時候要注意,因為要宣告兩個ContentProvider,所以authority也要不一樣,否則就會因為找不到對應的ContentPr
【機器學習PAI實戰】—— 玩轉人工智慧之美食推薦
開發十年,就只剩下這套架構體系了! >>>
【機器學習PAI實戰】—— 玩轉人工智慧之商品價格預測
開發十年,就只剩下這套架構體系了! >>>
Android之應用開發基礎
程序包 兼容 能夠 tick 狀態欄通知 lib 系統應用 java 指定 Android應用開發基礎 英文地址:http://developer.android.com/guide/components/fundamentals.html 本人英語水平不高,如有