建設(shè)一個怎樣的自己的網(wǎng)站濟(jì)南競價托管公司
一、簡介
? ? ? ?在Vue中使用的是MVVM架構(gòu)。通過ViewModel可以實(shí)現(xiàn)M層和V層數(shù)據(jù)的雙向綁定。Model層的數(shù)據(jù)發(fā)生變化后,會自動更新View層UI。UI層數(shù)據(jù)發(fā)生變化(用戶輸入),可以驅(qū)動Model層的數(shù)據(jù)發(fā)生變化,借助于Vue框架中的ViewModel實(shí)現(xiàn)數(shù)據(jù)和UI的雙向驅(qū)動。
? ? 在Android中也想實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,怎么辦呢?
? JetPack中的DataBinding就充當(dāng)了ViewModel的角色,用來實(shí)現(xiàn)數(shù)據(jù)的雙向綁定。
Android app的開發(fā)架構(gòu)從最開始的MVC到MVP,到MVVM,進(jìn)一步的解耦。
在Vue中,開發(fā)者只需維護(hù)數(shù)據(jù)的變化就行,數(shù)據(jù)變化后,會自動刷新UI,大大提示了開發(fā)效率。
Android層面實(shí)現(xiàn)MVVM,要比在Vue中復(fù)雜些,需要做的準(zhǔn)備工作很多。
在Android中使用DataBinding后,不需要再寫findVIewById方法,也不需要調(diào)用VIew的setText,
這也就實(shí)現(xiàn)了Model層和VIew層的解耦,在Vue中也不需要手動操作dom來更新UI。
二、DataBinding在Android中的應(yīng)用。
? ? 1.app項(xiàng)目中開啟DataBinding支持,默認(rèn)是關(guān)閉的。
? ? ? ? ?builder.gradle ---android節(jié)點(diǎn)下配置?
dataBinding {enabled true}
? ? 2.編寫model層代碼JavaBean
? ? ? 和編寫普通JavaBean,除了寫get、set方法外有以下不同。
? ? ? ?1)定義的JavaBean需要繼承BaseObservable 類
? ? ? ?2)在get方法上添加注解@Bindable,DataBinding需要通過注解來解析定義的方法。
? ? ? ?3)在set方法中添加對應(yīng)的方法?,
? ? ? ? ? ? ?notifyPropertyChanged(BR.age);?notifyPropertyChanged(BR.name);
public class User extends BaseObservable {private String name;private String age;@Bindablepublic String getName() {return name;}public void setName(String name) {this.name = name;notifyPropertyChanged(BR.name);}@Bindablepublic String getAge() {return age;}public void setAge(String age) {this.age = age;notifyPropertyChanged(BR.age);}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age='" + age + '\'' +'}';}
}
? BR是注解處理器(Annotation Processing Tool,簡稱APT)解析JavaBean生成的類,和android中的R文件類似。編寫完JavaBean之后,通過Build生成的類,
package com.example.jetpack;public class BR {public static final int User = 1;public static final int _all = 0;public static final int age = 2;public static final int name = 3;
}
通過以上步驟,完成了MVVM中model層代碼的編寫。
3.View層代碼的編寫。
? ?1)在普通的layout布局中按下alt+enter鍵,選擇Convert to data binding layout,
? ? ? ? 把普通的layout轉(zhuǎn)換成 dataBinding規(guī)范的layout
轉(zhuǎn)換完之后的樣式:
? ? 1)根布局變成了layout。
? ? 2)多了一個data標(biāo)簽,這里面可以定義我們編寫的JavaBean類,如下:
? ? ? ? name 定義的是View中引用的字符串,可以通過User來獲取到里面的值
? ? ? ? type定義的是類型,?可以是基本類型也可以是自定義類型。
在View中設(shè)置值,這一步完成了數(shù)據(jù)與UI的綁定。通過@{User.name}
<TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{User.name}"android:textColor="@color/black"android:textSize="16sp" /><TextViewandroid:id="@+id/age"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{User.age}"android:textColor="@color/black"android:textSize="16sp" />
? 2)在Activity中
? ? ?代替常規(guī)寫法setContentView(R.layout.activity_data_user);
? ? ?通過DataBindingUtil.setContentView(this, R.layout.activity_data_user);把修改后的layout設(shè)置在Activity中,返回值是?ActivityDataUserBinding類型,他也是通過APT自動生成的類。
ActivityDataUserBinding的實(shí)現(xiàn)類就是ActivityDataUserBindingImpl
生成的類名是和定義layout文件名一一對應(yīng)的。
??
?Activity中完整寫法:
private User user;private int age = 18;private ActivityDataUserBinding dataBinding;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_data_user);dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_user);user = new User();user.setAge(String.valueOf(age));user.setName("xiaohua");//通過返回的對象,把User對象設(shè)置進(jìn)去,沒有這一步是無法生效的。dataBinding.setUser(user);findViewById(R.id.set_user).setOnClickListener(v -> {//修改user的屬性值,界面會自動刷新。user.setAge(String.valueOf(++age));user.setName("xiaohua");});findViewById(R.id.get_user).setOnClickListener(v -> {Log.e("nyz", "user " + user.toString());});}
通過以上步驟,就完成了Model到View層的數(shù)據(jù)綁定,數(shù)據(jù)發(fā)生變化后,UI自動刷新。
4)DataBinding是如何做到UI發(fā)生變化自動更新數(shù)據(jù)的呢?非常簡單。
通過@={User.name} 可以把獲取到的值,復(fù)制給User.name,在Java層可以接受到變化后的值。
這樣就完成了View到Model的數(shù)據(jù)綁定
<EditTextandroid:id="@+id/name_et"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@={User.name}" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@={User.age}" />
具體效果:
? ?可以看到調(diào)用setValue修改User的name和age時,界面中的TextView也跟著更新了,做到了數(shù)據(jù)驅(qū)動UI。
?當(dāng)通過修改Edittext中的name和age時,TextView中的也更新了,這個就是UI變了,數(shù)據(jù)跟著變,數(shù)據(jù)變了,UI跟著變。
代碼下載:?https://download.csdn.net/download/niuyongzhi/88382202