前言
JetPack系列文章已更新:https://huanglinqing.blog.csdn.net/article/details/106215492
2020.0405 更新- 本文只講解DataBinding的使用,非架構MVVM
關於開發模式的文章,這應該算是第二篇,第一篇中講解了Android MVP模式的使用:https://blog.csdn.net/huangliniqng/article/details/80570920
mvp模式的優點就不說了,缺點其實在使用的過程中很顯然,比如現在有個需求對數據庫的學生表增刪改查,那麼view的接口,我們可能有如下定義
interface view{
void get();
void delete();
void add();
void update();
}
我們在使用的View層繼承下列接口即可,但如果有兩個Activity,一個需要查詢、一個需要修改、一個需要所有功能,那麼這個時候如果我們繼承這個view接口,肯定會出現View層含有沒有使用的接口。當然我們可以將四個接口放在四個view層,但工作量和維護起來並不方便。
一、Android MVVM介紹
個人認爲,MVVM的出現,並不是解決上述MVP的缺點,無論是MVP、MVC或是MVVM都有各自的缺點和優點,在開發中選擇合適的開發模式,纔能有助於開發工作。
MVVM並不是分爲了四層,而是將MVP中的P層變爲了ViewModel層。還是以查詢數據爲例,如果我們要將查詢出來的數據顯示在控件上,我們要定義view層的如下方法
void setData(String data);
在Activity的接口回調中進行setText,但是如果顯示的數據特別多,就要set多次,MVVM的最佳使用方式是MVP+DataBinding,MVVM可以實現數據直接和View層的控件綁定,和監聽事件的綁定。接下來我們開始介紹MVVM的使用步驟。
二、DataBinding的使用步驟
2.1 引入Data Binding函數庫
在build .gradle中使用如下設置支持dataBinding:
dataBinding{
enabled = true
}
2.2 新建一個User實體類
爲了模擬數據我們新建一個User類如下
public class User {
private String UserName;
private String UserSex;
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public String getUserSex() {
return UserSex;
}
public void setUserSex(String userSex) {
UserSex = userSex;
}
public User(String userName, String userSex) {
UserName = userName;
UserSex = userSex;
}
}
2.3 編寫xml佈局,有兩個textview一個顯示UserName,另一個顯示UserSex,在普通的xml佈局中我們都是使用LinearLayout或者是其他的ViewGroup,但是在mvvm中我們使用的根佈局是layout,xml佈局代碼如下所示:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="User"
type="lonbon.com.mvvm.bean.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{User.userName}" />
<TextView
android:id="@+id/userSex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{User.userSex}" />
</LinearLayout>
</layout>
佈局中我們要注意的是這個data便籤,其中type字段是數據綁定對應的實體類,name就是我們引用的一個屬性標誌,在這裏寫爲User,如果要給textView賦值,我們直接通過@{User.屬性},相當於把userSex屬性變量賦值給id爲userSex的TextView。
2.4 在Activity中引用
以爲我們已經配置了databinding屬性爲true,所以會自動爲我們生成Binding類,生成規則爲佈局名後面加Binding,比如我們這裏的佈局名稱是activity_main,生成的Bingding類就是ActivityMainBinding,我們在Activity中通過下列代碼使用:
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("黃林晴", "男");
activityMainBinding.setUser(user);
我們通過DataBindingUtil獲取databinding類直接與User數據綁定,運行程序,那麼會直接將userName和userSex賦值到相應的值。
結果如圖所示:
如果我們是給ListView中的Item中的控件賦值,那麼xml佈局中的代碼都是一致的,不同的是獲取bingding類是使用
ListItemBinding bingding = ListItemBinding.inflate(layoutInflater,ViewGroup,false);
或者使用
ListItemBinding bingding = DataBindingUtil.inflate(layoutInflater,R.layout.activity_main,ViewGroup,false);
三、DataBing使用之監聽事件
DatabBing監聽事件的使用其實個人感覺使用的效果並不好,因爲現在差不多都是使用ButterKnife直接生成監聽事件,不過還是要提一下,我們在之前的佈局上加一個button,給button賦值監聽事件,首先我們定義一個監聽事件的類,我們可以在這個類中專門處理所有的監聽事件,類似於js這也算一個好處吧。
3.1 定義一個Click類,聲明一個test監聽方法
代碼如下所示:
public class Click {
private String tag = "click";
public void test(View v) {
Log.d(tag, "點擊事件觸發了");
}
}
3.2 在xml中進行綁定
在data標籤中再添加一個variable標籤
<variable
name="Click"
type="lonbon.com.mvvm.click.Click"/>
在button中爲onclick屬性設置
<Button
android:text="text"
android:onClick="@{Click.Text}"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
最後記得在activity進行設置:
activityMainBinding.setClick(new Click());
這裏要注意的是並不是調用setClick方法,如果你新建的監聽方法類是Text那麼就要調用setText進行監聽事件的綁定,我們來點擊按鈕,打印結果如下:
DataBinding的使用主要就是這樣了,還有一些功能需要深入研究,後續繼續分享。
代碼男人技術交流羣