英文:Android Data Binding: Dependent Properties
Android 數(shù)據(jù)綁定:屬性依賴
聲明 替代手寫依賴
Android Studio 2.3 正式版已經(jīng)發(fā)布 抢呆,現(xiàn)在我想談一些你可能會(huì)在數(shù)據(jù)綁定中使用到的新特征. 其中一件很酷的事就是你可以創(chuàng)建屬性依賴迄汛。
命名噩斟,命名士飒,命名
假設(shè)在應(yīng)用中帘营,我用一個(gè)viewmodel
來表示用戶尉姨。它會(huì)包含 first name
, last name
, user name
, 和 display name
. 當(dāng)這些屬性改變的時(shí)候并级,UI也應(yīng)當(dāng)跟著變化, 所以 我需要讓它可以被觀察拂檩。
public class User extends BaseObservable {
private String firstName;
private String lastName;
private String userName;
private Resources resources;
public User(Resources resources) {
this.resources = resources;
}
@Bindable
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
notifyPropertyChanged(BR.displayName);
}
@Bindable
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
notifyPropertyChanged(BR.displayName);
}
@Bindable
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
notifyPropertyChanged(BR.userName);
notifyPropertyChanged(BR.displayName);
}
@Bindable
public String getDisplayName() {
if (firstName == null) {
if (lastName == null) {
return userName;
} else {
return lastName;
}
} else if (lastName == null) {
return firstName;
} else {
return resources.getString(R.id.name,
firstName, lastName);
}
}
}
你可以看到在 display name
沒有可以回退的地方。它只是檢查其它的屬性并且基于它們產(chǎn)生一個(gè)值嘲碧。
在 User 類里稻励,不管是 firstName
, lastName
, 還是 userNames
改變, displayName
都會(huì)被更新因?yàn)槲乙呀?jīng)在它們各自的 setter
方法中通知了。
這是一個(gè)常見的情景:一個(gè)屬性依賴另一個(gè)屬性愈涩。依賴的屬性 (e.g. setFirstName())必須通知它的依賴屬性改變望抽,但是這并不好.
聲明屬性依賴
在 Android Studio 2.3,你可以聲明一個(gè)可綁定的屬性來依賴其他屬性:
public class User extends BaseObservable {
//...
@Bindable
public String getFirstName() { ... }
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
}
@Bindable
public String getLastName() { ... }
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
@Bindable
public String getUserName() { ... }
public void setUserName(String userName) {
this.userName = userName;
notifyPropertyChanged(BR.userName);
}
@Bindable({"firstName", "lastName", "userName"})
public String getDisplayName() { ... }
}
Bindable 注解使用一個(gè)可選的參數(shù)來聲明這些依賴。 displayName
屬性被聲明依賴于 firstName, lastName, 和 userName 屬性履婉。不管這些屬性有什么改變, displayName 都會(huì)被更新煤篙。
這些依賴完全是在生成的bingding
文件被估算的。那也意味著如果你附加一個(gè) Observable
給 User
,當(dāng)其它屬性改變的時(shí)候毁腿,你不會(huì)得到一個(gè)給 displayName
的通知辑奈。
使用屬性依賴可以幫助你清理viewModel
。當(dāng)潛在的數(shù)據(jù)模型是相對標(biāo)準(zhǔn)化—?在多個(gè)屬性里數(shù)據(jù)不是重復(fù)的?—? viewmodel
是為了展示UI而定做的已烤。 那意味著屬性間會(huì)經(jīng)常相互影響鸠窗。
舉個(gè)例子,想象一下你的UI展示一張賬單草戈,你的商店基于購買的總額給予折扣塌鸯。這個(gè)折扣也可以基于總額的一部分侍瑟。然后唐片,如果你想根據(jù)發(fā)貨的狀態(tài)來更改折扣,只需要更新折扣屬性,而不用更新狀態(tài)屬性涨颜。
屬性依賴會(huì)幫助你使你的 viewmodel
稍微簡潔一點(diǎn)并且更容易維護(hù)费韭。
Thanks to Chet Haase.