亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

MVVM的詳細講解

2019-11-09 18:32:26
字體:
來源:轉載
供稿:網友

注:主要參考精通 Android Data Binding,官方文檔,感謝分享。

一、準備工作

要求Android Studio版本是1.5+,使用ecl二、MVVM的簡單應用

第一步:創建xml布局

創建一個布局xml文件,就像以前一樣,我們需要在那個view中使用,就按照固定寫法操作。在這個框架下我們的思維要稍稍改變一下了,以前的布局XML只描述了布局,它是相對固定的東西,在Data Binding Library下我們的布局XML就像是一個類,他可以有變量也能進行一定的運算。其實Data Binding Library還真的給你生成了一個類似這樣的類(這個類在綁定數據時會用到,命名規則:activity_main.xml—》ActivityMainBinding)。

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"><!--layout層,不是常見的5種布局;命名空間--> <data> <import type="com.xfyb.mvvmtest.User"></import><!--導包,一次導入,下面都可以使用該類。前提是我們已經創建出來了該類--> <variable name="user" type="User"/><!--創建對象--> </data> <!--原有的文件--> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/><!--View中使用變量用@{} 格式來調用--> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="change" android:text="change"/> </LinearLayout></layout>

第二步:定義數據對象 在上面中我們提到需要創建User的對象,因此我們需要將其創建出來。

public class User { PRivate String Name; public void setAge(int age) { this.age = age; } public void setName(String name) { Name = name; } private int age; public User(String name, int age) { Name = name; this.age = age; } public int getAge() { return age; } public String getName() { return Name; }}

這個類就是一個簡單的Bean類,也就是我們在View中需要調用的對象屬性。

第三步:綁定數據

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding;//自動生成的類ActivityMainBinding其實就是代表了那個布局,里面包括了布局的View,我們聲明的變量。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* setContentView(R.layout.activity_main);*/ binding = DataBindingUtil.setContentView(this, R.layout .activity_main);//原來設置布局的setContentView改成了DataBindingUtil.setContentView user = new User("XK",18);//創建對象,賦初始值 binding.setUser(user); } public void change (View view){ user.setName("KX"); binding.setUser(user); }}

基于以上三步,我們就將基于Data Binding 的MVVM的簡單編寫就完成了,當我們實際運行時,如下界面:

這里寫圖片描述

但是當我們點擊BUTTON時發現無法更改name的值,無法刷新textView。 解決方案: 1、讓實體類繼承BaSEObservable類

修改后的代碼如下所示:

public class User extends BaseObservable {//繼承自BaseObservable private String Name; public void setAge(int age) { this.age = age; } public void setName(String name) { Name = name; } private int age; public User(String name, int age) { Name = name; this.age = age; } @Bindable//添加注解 public int getAge() { return age; } @Bindable public String getName() { return Name; }}

當我們再次點擊時,就會修改name屬性的值。 這里寫圖片描述

至此我們對于MVVM的簡單應用就完成了,對于此應用我們主要是注意書寫的規范及格式就可以了,特別是對于xml的文件的配置、User類的注解和綁定數據使用時的規范。

總結: 使用基于Data Binding的操作有以下優勢:

1、不需要在Activity里寫很多的findViewById2、在xml中我們只需要通過import導入需要的類的全包名,下面都可以使用。3、引用綁定數據的對象時的格式:以@開始,以{}包裹的形式出現,而內容呢?是user.name。user就是我們上面定義的variable。

三、MVVM的高級應用

1、使用類中方法

定義一個靜態方法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 節點中導入: <import type="com.xfyb.mvvmtest.MyStringUtils"></import>使用方法與 java 語法一樣:<TextView android:text="@{MyStringUtils.capitalize(user.name)}" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

總結:

使用類中的方法,注意方法的參數和返回值,否則無法正常生成ActivityMainBinding類,導致編譯失敗

使用類中的方法,與常見的java一樣,可以是通過靜態方法,也可以與簡單應用中對于name的引用一樣采用“variable”的格式。

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

<import type="com.example.home.data.User" /><import type="com.examle.detail.data.User" /><variable name="user" type="User" />

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

<import type="com.example.home.data.User" /><import type="com.examle.detail.data.User" alias="DetailUser" /><variable name="user" type="DetailUser" />

3、Null Coalescing 運算符

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

就等價于

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

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

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

5、Observable Binding 要實現 Observable Binding,首先得有一個 implement 了接口 android.databinding.Observable 的類,為了方便,Android 原生提供了已經封裝好的一個類 - BaseObservable,并且實現了監聽器的注冊機制。我們可以直接繼承 BaseObservable。

public class User extends BaseObservable { private String Name; public void setAge(int age) { this.age = age; notifyPropertyChanged(BR.age); } public void setName(String name) { Name = name; notifyPropertyChanged(BR.name);//通知改變屬性 } private int age; public User(String name, int age) { Name = name; this.age = age; } @Bindable public int getAge() { return age; } @Bindable public String getName() { return Name; }}

BR 是編譯階段生成的一個類,功能與 R.java 類似,用 @Bindable 標記過 getter 方法會在 BR 中生成一個 entry。 通過代碼可以看出,當數據發生變化時還是需要手動發出通知。 通過調用 notifyPropertyChanged(BR.firstName) 可以通知系統 BR.firstName 這個 entry 的數據已經發生變化,需要更新 UI。

6、帶 ID 的 View 在使用Data Binding 有效降低了代碼的冗余性,甚至完全沒有必要再去獲取一個 View 實例。我們可以直接在xml中使用id就可以了

<TextView android:id="@+id/tv_show" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

在代碼中我們可以直接通過banding中找到(類似于java中的類和屬性)。

binding.tvShow.setText("xxxx");//直接同對象.屬性 獲取到

運行后的效果: 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品资源| 成人做爽爽免费视频| 久久久久久久久久av| 国产拍精品一二三| 国产美女精品视频免费观看| 久久久久久国产精品三级玉女聊斋| 国产日韩精品在线播放| 亚洲欧美日韩天堂| 91成人天堂久久成人| 亚洲欧美999| 一个人www欧美| 欧美高清理论片| 久久成人一区二区| 欧美色视频日本版| 亚洲天堂av图片| 欧美日韩国产综合新一区| 欧美肥臀大乳一区二区免费视频| 精品国产一区二区三区久久狼5月| 欧美高清在线视频观看不卡| 成人黄色av网| 欧美—级a级欧美特级ar全黄| 欧美色另类天堂2015| 成人97在线观看视频| 在线午夜精品自拍| 国产精品看片资源| 亚洲欧美成人一区二区在线电影| 久久影院免费观看| 亚洲人成电影在线观看天堂色| 91久久国产综合久久91精品网站| 亚洲国产一区二区三区在线观看| 国产成人精品亚洲精品| 黑人巨大精品欧美一区二区三区| 国产区亚洲区欧美区| 永久555www成人免费| 欧美尤物巨大精品爽| 国产日韩精品在线播放| 九九热r在线视频精品| 91免费综合在线| 欧洲美女7788成人免费视频| 国产成人avxxxxx在线看| 色一区av在线| 亚洲精品日韩欧美| 国产裸体写真av一区二区| 国产精品亚洲第一区| 国产精品主播视频| 欧美日韩ab片| 亚洲色图国产精品| 欧美日韩亚洲精品一区二区三区| 欧美精品免费看| 亚洲一区二区三区乱码aⅴ蜜桃女| 97国产精品视频人人做人人爱| 北条麻妃一区二区三区中文字幕| 九九热99久久久国产盗摄| 久久久av一区| 国产性猛交xxxx免费看久久| 久久久精品一区二区| 久久久久久国产精品三级玉女聊斋| 欧美午夜电影在线| 在线观看日韩欧美| 亚洲色图狂野欧美| 亚洲性视频网站| 91精品国产高清自在线| 欧美激情一级欧美精品| 姬川优奈aav一区二区| 久精品免费视频| 国内精品久久久久久久| 欧美激情精品久久久久久大尺度| 亚洲亚裔videos黑人hd| 色av吧综合网| 国产一区二区三区视频在线观看| 欧美日韩成人在线视频| 欧美一二三视频| 成人黄色在线播放| 免费91麻豆精品国产自产在线观看| 久热精品在线视频| 国产精品天天狠天天看| 亚洲va欧美va国产综合久久| 欧美极品少妇xxxxx| 日韩在线播放一区| 亚洲视频日韩精品| 性欧美暴力猛交69hd| 亚洲成色777777女色窝| 91伊人影院在线播放| 欧美国产日本在线| 91免费在线视频网站| 久久亚洲精品毛片| 91精品国产高清自在线看超| 日韩精品免费在线视频观看| 51色欧美片视频在线观看| 日韩精品免费电影| 亚洲日本aⅴ片在线观看香蕉| 国产精品久久久久久久久影视| 国产精品白丝jk喷水视频一区| 国产有码在线一区二区视频| 亚洲精品色婷婷福利天堂| 欧美视频专区一二在线观看| 在线免费看av不卡| 欧美在线激情网| 欧美亚洲成人精品| 日本成人在线视频网址| 久久噜噜噜精品国产亚洲综合| 在线视频亚洲欧美| 91精品国产91久久久久久吃药| 日韩久久免费电影| 97色在线播放视频| 国产精品成人在线| 欧美电影免费观看| 成人在线中文字幕| 色中色综合影院手机版在线观看| 国产精品日韩久久久久| 日韩av免费一区| 久久资源免费视频| 欧美亚洲视频在线看网址| 日韩国产精品亚洲а∨天堂免| 国产精品第七十二页| 色综合久久中文字幕综合网小说| 亚洲精品www久久久久久广东| 粉嫩av一区二区三区免费野| 欧美日韩国产在线看| 国产在线观看一区二区三区| 伊人久久精品视频| 97久久精品人搡人人玩| 国产精品人成电影| 精品亚洲精品福利线在观看| 国产日韩欧美中文在线播放| 69av成年福利视频| 国产丝袜精品视频| 在线日韩中文字幕| 91精品免费久久久久久久久| 欧美一区亚洲一区| 亚洲直播在线一区| 欧美美最猛性xxxxxx| 国产精品观看在线亚洲人成网| 日本高清不卡在线| 成人精品网站在线观看| 国产伦精品免费视频| 欧美日韩在线视频观看| 欧美激情国内偷拍| 国产精品免费视频久久久| 国产精品国产三级国产专播精品人| 午夜精品久久久久久久99热| 在线成人激情视频| 亚洲色图色老头| 亚洲精品日韩激情在线电影| 97在线观看免费| 亚洲人成伊人成综合网久久久| 国产精品男人爽免费视频1| 2020国产精品视频| 九九热精品视频国产| 黄色成人在线免费| 欧美在线视频a| 欧美第一黄色网| 日韩av免费一区| 精品在线小视频| 日韩不卡在线观看| 欧美性猛交xxxx免费看久久久| 亚洲精品国产欧美| 欧美尺度大的性做爰视频| 91亚洲精品久久久久久久久久久久| 日韩中文在线视频| 国产一区二区香蕉| 亚洲a成v人在线观看| 国产高清视频一区三区| 久久久久北条麻妃免费看|