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

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

MVVM的詳細講解

2019-11-09 19:04:11
字體:
來源:轉載
供稿:網友

注:主要參考精通 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
欧美性受xxx| 国产精品久久久久久影视| 国产精品第七十二页| 久久精品国产69国产精品亚洲| 亚洲欧美国产高清va在线播| 久久久精品影院| 亚洲白虎美女被爆操| 午夜精品99久久免费| 91精品国产色综合久久不卡98口| www.亚洲成人| 国产香蕉一区二区三区在线视频| 欧美第一黄色网| 国语自产精品视频在线看抢先版图片| 久久国产精品视频| 最近2019好看的中文字幕免费| 国内外成人免费激情在线视频| 日韩欧美国产成人| 亚洲免费小视频| 亚洲精品久久久久久下一站| 日韩av在线网站| 精品国产成人在线| 中文综合在线观看| 欧美日韩亚洲一区二| 91成人在线视频| 亚洲国产一区自拍| 成人福利视频在线观看| 精品福利在线观看| 伊人成人开心激情综合网| 国产成人综合精品| 色偷偷88888欧美精品久久久| 国内精品久久久久久中文字幕| 国产日韩欧美视频在线| 国产精品黄色影片导航在线观看| 国产成人亚洲综合91精品| 日韩精品有码在线观看| 日韩精品在线观看一区| 国产精品久久久久久久午夜| 欧美日韩国产一中文字不卡| 亚洲人成电影在线观看天堂色| 日韩精品一区二区视频| 亚洲精品小视频在线观看| 中文综合在线观看| 亚洲精品第一国产综合精品| 日韩在线视频观看| 久久久电影免费观看完整版| 亚洲第一色在线| 日本久久亚洲电影| 久久精品国产欧美亚洲人人爽| 国产日韩精品一区二区| 91精品在线国产| 91精品国产91久久久久久久久| 成人网欧美在线视频| 日本三级韩国三级久久| 亚洲欧美日韩在线高清直播| 午夜精品久久久久久久99黑人| 中日韩美女免费视频网站在线观看| 国产精品久在线观看| 国产精品久久久久福利| 亚洲国模精品一区| 亚洲精品久久久一区二区三区| 亚洲精品一区二三区不卡| 亚洲国产精品va| 久久国产精品久久久久久| 九九热视频这里只有精品| 亚洲欧洲成视频免费观看| 成人国产精品久久久久久亚洲| 亚洲国产成人爱av在线播放| 亚洲精品在线观看www| 亚洲人午夜精品| 色噜噜久久综合伊人一本| www.国产一区| 国内精品美女av在线播放| 国产小视频91| 成人黄色在线免费| 亚洲天堂开心观看| 国产精品国产亚洲伊人久久| 欧美黑人狂野猛交老妇| 国产精品激情av电影在线观看| 亚洲欧美国产精品| 亚洲国产精品一区二区久| 69av成年福利视频| 91九色在线视频| 亚洲免费一在线| 亚洲人成电影网站色xx| 欧美性69xxxx肥| 国产在线一区二区三区| 综合久久五月天| 欧美床上激情在线观看| 91av在线国产| 国产精品高潮呻吟久久av野狼| 亚洲第一中文字幕| 97在线精品视频| 久久久精品电影| 精品一区电影国产| 日韩欧美在线中文字幕| 欧美超级免费视 在线| 少妇av一区二区三区| 欧美精品少妇videofree| 国产精品老女人精品视频| 久久久久久成人精品| 亚洲999一在线观看www| 欧美成人午夜影院| 久久久91精品国产一区不卡| 91成人天堂久久成人| 91精品国产777在线观看| 久久夜色精品国产| 欧美电影免费在线观看| 日韩有码在线观看| 亚洲国产成人久久| 国产精品三级久久久久久电影| 日韩经典中文字幕在线观看| 在线亚洲午夜片av大片| 中文字幕免费国产精品| 欧美综合在线第二页| 成人妇女淫片aaaa视频| 国产第一区电影| 日韩综合中文字幕| 亚洲精品电影在线| 麻豆乱码国产一区二区三区| 北条麻妃99精品青青久久| 国产精品白丝av嫩草影院| 国产精品91久久久久久| 日韩精品免费一线在线观看| 午夜精品久久久99热福利| 丝袜亚洲另类欧美重口| 日韩在线小视频| 97香蕉超级碰碰久久免费的优势| 精品久久久久久| 欧美激情一级二级| 久久福利视频导航| 亚洲国产美女久久久久| 色爱av美腿丝袜综合粉嫩av| 色综合久久久久久中文网| 色综久久综合桃花网| 久久久精品久久久久| 久久av红桃一区二区小说| 国产精品久久久久久搜索| 亚洲欧洲在线免费| 97免费在线视频| 欧美黑人又粗大| 欧美日韩国产在线| 国产精品稀缺呦系列在线| 在线免费观看羞羞视频一区二区| 久久久久久久久久久国产| 国产成人在线一区二区| 这里只有视频精品| 日韩视频在线一区| 日本a级片电影一区二区| 色老头一区二区三区| 大伊人狠狠躁夜夜躁av一区| 55夜色66夜色国产精品视频| 国产精品7m视频| 全球成人中文在线| 欧美精品aaa| 欧美精品一区二区免费| 日韩精品极品毛片系列视频| 国产精品丝袜久久久久久高清| 国产精品欧美亚洲777777| 热久久视久久精品18亚洲精品| 亚洲精品自产拍| 成人免费视频网| 国产精品美女免费视频| 日韩一中文字幕| 亚洲欧美中文日韩在线v日本|