(三晌涕、7)將布局視圖綁定到體系結(jié)構(gòu)組件

AndroidX庫(kù)包含架構(gòu)組件,您可以使用它來(lái)設(shè)計(jì)健壯痛悯,可測(cè)試和可維護(hù)的應(yīng)用程序余黎。 數(shù)據(jù)綁定庫(kù)可與架構(gòu)組件無(wú)縫協(xié)作,進(jìn)一步簡(jiǎn)化UI的開(kāi)發(fā)载萌。 應(yīng)用程序中的布局可以綁定到體系結(jié)構(gòu)組件中的數(shù)據(jù)惧财,這些數(shù)據(jù)已經(jīng)幫助您管理UI控制器生命周期并通知數(shù)據(jù)中的更改。

此頁(yè)面顯示如何將架構(gòu)組件合并到您的應(yīng)用程序扭仁,以進(jìn)一步增強(qiáng)使用數(shù)據(jù)綁定庫(kù)的好處垮衷。

一、使用LiveData通知UI有關(guān)數(shù)據(jù)更改的信息

您可以使用LiveData對(duì)象作為數(shù)據(jù)綁定源斋枢,以自動(dòng)通知UI有關(guān)數(shù)據(jù)更改的信息帘靡。 有關(guān)此體系結(jié)構(gòu)組件的更多信息,請(qǐng)參閱LiveData概述瓤帚。

與實(shí)現(xiàn)Observable的對(duì)象(例如可觀察字段)不同描姚,LiveData對(duì)象了解訂閱數(shù)據(jù)更改的觀察者的生命周期涩赢。 這些知識(shí)帶來(lái)了許多好處,使用LiveData的優(yōu)勢(shì)對(duì)此進(jìn)行了解釋轩勘。 在Android Studio 3.1及更高版本中筒扒,您可以使用數(shù)據(jù)綁定代碼中的LiveData對(duì)象替換可觀察字段。

要將LiveData對(duì)象與綁定類(lèi)一起使用绊寻,需要指定生命周期所有者以定義LiveData對(duì)象的范圍花墩。 以下示例在實(shí)例化綁定類(lèi)之后將活動(dòng)指定為生命周期所有者:

class ViewModelActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Inflate view and obtain an instance of the binding class.
        UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user);

        // Specify the current activity as the lifecycle owner.
        binding.setLifecycleOwner(this);
    }
}

您可以使用ViewModel組件(如使用ViewModel中所述來(lái)管理與UI相關(guān)的數(shù)據(jù)),以將數(shù)據(jù)綁定到布局澄步。 在ViewModel組件中冰蘑,您可以使用LiveData對(duì)象轉(zhuǎn)換數(shù)據(jù)或合并多個(gè)數(shù)據(jù)源。 以下示例顯示如何轉(zhuǎn)換ViewModel中的數(shù)據(jù):

class ScheduleViewModel extends ViewModel {
    LiveData username;

    public ScheduleViewModel() {
        String result = Repository.userName;
        userName = Transformations.map(result, result -> result.value);
}

二村缸、使用ViewModel管理與UI相關(guān)的數(shù)據(jù)

數(shù)據(jù)綁定庫(kù)與ViewModel組件無(wú)縫協(xié)作祠肥,后者顯示布局觀察到的數(shù)據(jù)并對(duì)其更改做出反應(yīng)。 將ViewModel組件與數(shù)據(jù)綁定庫(kù)一起使用梯皿,可以將UI邏輯從布局移動(dòng)到組件中仇箱,這些組件更易于測(cè)試。 數(shù)據(jù)綁定庫(kù)可確保在需要時(shí)綁定和取消綁定數(shù)據(jù)源东羹。 剩下的大部分工作都在于確保您公開(kāi)正確的數(shù)據(jù)剂桥。 有關(guān)此體系結(jié)構(gòu)組件的更多信息,請(qǐng)參閱ViewModel概述属提。

要將ViewModel組件與數(shù)據(jù)綁定庫(kù)一起使用权逗,必須實(shí)例化從Viewmodel類(lèi)繼承的組件,獲取綁定類(lèi)的實(shí)例垒拢,并將ViewModel組件分配給綁定類(lèi)中的屬性旬迹。 以下示例顯示如何將該組件與庫(kù)一起使用:

class ViewModelActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Obtain the ViewModel component.
        UserModel userModel = ViewModelProviders.of(getActivity())
                                                  .get(UserModel.class);

        // Inflate view and obtain an instance of the binding class.
        UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user);

        // Assign the component to a property in the binding class.
        binding.viewmodel = userModel;
    }
}

在布局中火惊,使用綁定表達(dá)式將ViewModel組件的屬性和方法分配給相應(yīng)的視圖求类,如以下示例所示:

<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@{viewmodel.rememberMe}"
    android:onCheckedChanged="@{() -> viewmodel.rememberMeChanged()}" />

三、使用Observable ViewModel可以更好地控制綁定適配器

您可以使用實(shí)現(xiàn)Observable的ViewModel組件來(lái)通知其他應(yīng)用程序組件有關(guān)數(shù)據(jù)更改的信息屹耐,類(lèi)似于使用LiveData對(duì)象的方式尸疆。

在某些情況下,您可能更喜歡使用ViewModel組件來(lái)實(shí)現(xiàn)Observable接口而不是使用LiveData對(duì)象惶岭,即使您丟失了LiveData的生命周期管理功能寿弱。使用實(shí)現(xiàn)Observable的ViewModel組件可以更好地控制應(yīng)用程序中的綁定適配器。例如按灶,此模式使您可以在數(shù)據(jù)更改時(shí)更好地控制通知症革,還允許您指定自定義方法以在雙向數(shù)據(jù)綁定中設(shè)置屬性的值。

要實(shí)現(xiàn)可觀察的ViewModel組件鸯旁,必須創(chuàng)建一個(gè)繼承自ViewModel類(lèi)并實(shí)現(xiàn)Observable接口的類(lèi)噪矛。當(dāng)觀察者使用addOnPropertyChangedCallback()和removeOnPropertyChangedCallback()方法訂閱或取消訂閱通知時(shí)量蕊,您可以提供自定義邏輯。您還可以提供在notifyPropertyChanged()方法中屬性更改時(shí)運(yùn)行的自定義邏輯艇挨。以下代碼示例演示如何實(shí)現(xiàn)可觀察的ViewModel:

/**
 * A ViewModel that is also an Observable,
 * to be used with the Data Binding Library.
 */
class ObservableViewModel extends ViewModel implements Observable {
    private PropertyChangeRegistry callbacks = new PropertyChangeRegistry();

    @Override
    protected void addOnPropertyChangedCallback(
            Observable.OnPropertyChangedCallback callback) {
        callbacks.add(callback);
    }

    @Override
    protected void removeOnPropertyChangedCallback(
            Observable.OnPropertyChangedCallback callback) {
        callbacks.remove(callback);
    }

    /**
     * Notifies observers that all properties of this instance have changed.
     */
    void notifyChange() {
        callbacks.notifyCallbacks(this, 0, null);
    }

    /**
     * Notifies observers that a specific property has changed. The getter for the
     * property that changes should be marked with the @Bindable annotation to
     * generate a field in the BR class to be used as the fieldId parameter.
     *
     * @param fieldId The generated BR id for the Bindable field.
     */
    void notifyPropertyChanged(int fieldId) {
        callbacks.notifyCallbacks(this, fieldId, null);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末残炮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缩滨,更是在濱河造成了極大的恐慌势就,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脉漏,死亡現(xiàn)場(chǎng)離奇詭異苞冯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)侧巨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)抱完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人刃泡,你說(shuō)我怎么就攤上這事巧娱。” “怎么了烘贴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵禁添,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我桨踪,道長(zhǎng)老翘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任锻离,我火速辦了婚禮铺峭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汽纠。我一直安慰自己卫键,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布虱朵。 她就那樣靜靜地躺著莉炉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碴犬。 梳的紋絲不亂的頭發(fā)上絮宁,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音服协,去河邊找鬼绍昂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窘游。 我是一名探鬼主播卖陵,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼张峰!你這毒婦竟也來(lái)了泪蔫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喘批,失蹤者是張志新(化名)和其女友劉穎撩荣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體饶深,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡餐曹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敌厘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片台猴。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖俱两,靈堂內(nèi)的尸體忽然破棺而出饱狂,到底是詐尸還是另有隱情,我是刑警寧澤宪彩,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布休讳,位于F島的核電站,受9級(jí)特大地震影響尿孔,放射性物質(zhì)發(fā)生泄漏俊柔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一活合、第九天 我趴在偏房一處隱蔽的房頂上張望雏婶。 院中可真熱鬧,春花似錦白指、人聲如沸留晚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倔丈。三九已至憨闰,卻和暖如春状蜗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹉动。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工轧坎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泽示。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓缸血,卻偏偏與公主長(zhǎng)得像蜜氨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捎泻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容