Android 數據綁定:屬性依賴

shiyishi 7年前發布 | 4K 次閱讀 安卓開發 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

 

 本文由用戶 shiyishi 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!