Android 數據綁定:屬性依賴
icon.jpeg
Android 數據綁定:屬性依賴
Android Studio 2.3 正式版已經發布 ,現在我想談一些你可能會在數據綁定中使用到的新特征. 其中一件很酷的事就是你可以創建屬性依賴。
命名,命名,命名
假設在應用中,我用一個 viewmodel 來表示用戶。它會包含 first name , last name , user name , 和 display name . 當這些屬性改變的時候,UI也應當跟著變化, 所以 我需要讓它可以被觀察 。
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 沒有可以回退的地方。它只是檢查其它的屬性并且基于它們產生一個值。
在 User 類里,不管是 firstName , lastName , 還是 userNames 改變, displayName 都會被更新因為我已經在它們各自的 setter 方法中通知了。
這是一個常見的情景:一個屬性依賴另一個屬性。依賴的屬性 (e.g. setFirstName())必須通知它的依賴屬性改變,但是這并不好.
聲明屬性依賴
在 Android Studio 2.3 ,你可以聲明一個可綁定的屬性來依賴其他屬性:
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 注解使用一個可選的參數來聲明這些依賴。 displayName 屬性被聲明依賴于 firstName, lastName, 和 userName 屬性。不管這些屬性有什么改變, displayName 都會被更新。
這些依賴完全是在生成的 bingding 文件被估算的。那也意味著如果你附加一個 Observable 給 User ,當其它屬性改變的時候,你不會得到一個給 displayName 的通知。
使用屬性依賴可以幫助你清理 viewModel 。當潛在的數據模型是相對標準化— 在多個屬性里數據不是重復的 — viewmodel 是為了展示UI而定做的。 那意味著屬性間會經常相互影響。
舉個例子,想象一下你的UI展示一張賬單,你的商店基于購買的總額給予折扣。這個折扣也可以基于總額的一部分。然后,如果你想根據發貨的狀態來更改折扣,只需要更新折扣屬性,而不用更新狀態屬性。
屬性依賴會幫助你使你的 viewmodel 稍微簡潔一點并且更容易維護。
來自:http://www.jianshu.com/p/bc55ca46dc1a