Jetpack DataBinding

作用

  1. 將視圖綁定到Activity不再需要findViewById()
  2. DataBinding 與 ViewModle+LiveData 將可觀察數(shù)據(jù)反向綁定到View,此時可以實現(xiàn)一個結(jié)構(gòu)化較好的程序

使用

一脚作、將視圖綁定到Activity

1. build.gradle 啟用數(shù)據(jù)綁定

android {
    ......
    dataBinding {
        enabled = true
    }
}

2. xml中增加layout標(biāo)簽

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/but"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

</layout>

此時會自動生成與xml文件名相對應(yīng)的類例如 activity_main.xml 會生成 ActivityMainBinding 類

3. Activity中創(chuàng)建binding對象

private LayoutBinding binding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = DataBindingUtil.setContentView(this, R.layout.layout);
    binding.tv.setText("文本");
    binding.but.setOnClickListener(v -> {
        //...
    });
}

省略了findViewById 通過binding.id直接調(diào)用view葫哗,但這樣還不夠簡潔還需要.setText、setOnClickListener等操作設(shè)置數(shù)據(jù)球涛,通過下一步可以反向綁定將數(shù)據(jù)直接綁定到界面上

二劣针、DataBinding 與 ViewModle+LiveData 將可觀察數(shù)據(jù)反向綁定

  • ViewModel
public class MyViewModle extends ViewModel {
    // public int index = 0;
    private MutableLiveData<Integer> liveDataIndex;

    //獲取liveDataIndex類型
    public MutableLiveData<Integer> getLiveDataIndex() {
        if (null == liveDataIndex) {
            liveDataIndex = new MutableLiveData<>();
            liveDataIndex.setValue(0);
        }
        return liveDataIndex;
    }

    //liveDataIndex 數(shù)據(jù)加1
    public void addLiveDataIndex() {
        getLiveDataIndex().setValue(liveDataIndex.getValue() + 1);
    }
}
  • xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="data"
            type="com.example.modle.MyViewModle" />
      
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(data.liveDataIndex)}" />

        <Button
            android:id="@+id/but"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{()->data.addLiveDataIndex(1)}" />
    </LinearLayout>

</layout>

variable標(biāo)簽中引用了一個ViewModel,給TextView綁定數(shù)據(jù)liveDataIndex亿扁,在Button中綁定點擊事件調(diào)用addLiveDataIndex方法捺典,addLiveDataIndex執(zhí)行l(wèi)iveDataIndex數(shù)據(jù)變更,則界面自動更新从祝。此時Activity不在需要setText襟己、setListener()

  • Activity
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyViewModle myViewModle = new ViewModelProvider(this).get(MyViewModle.class);
    LayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.layout);
    binding.setData(myViewModle); // 此處的setData是布局variable name="data"
    binding.setLifecycleOwner(this);
}
  • Fragment
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    MyViewModle myViewModle = new ViewModelProvider(this).get(MyViewModle.class);
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_about, container, false);
    binding.setModel(myViewModle );
    binding.setLifecycleOwner(this); //委托當(dāng)前類管理生命周期
    return binding.getRoot();
}
  • 如果希望Fragment獲取Activity的ViewModel 使用requireActivity()
MyViewModle myViewModle = new ViewModelProvider(requireActivity()).get(MyViewModle.class);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市牍陌,隨后出現(xiàn)的幾起案子擎浴,更是在濱河造成了極大的恐慌,老刑警劉巖毒涧,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮预,死亡現(xiàn)場離奇詭異,居然都是意外死亡契讲,警方通過查閱死者的電腦和手機(jī)仿吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怀泊,“玉大人茫藏,你說我怎么就攤上這事∨恚” “怎么了务傲?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枣申。 經(jīng)常有香客問我售葡,道長,這世上最難降的妖魔是什么忠藤? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任挟伙,我火速辦了婚禮,結(jié)果婚禮上模孩,老公的妹妹穿的比我還像新娘尖阔。我一直安慰自己六敬,他們只是感情好砂心,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布版姑。 她就那樣靜靜地躺著能扒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪齿坷。 梳的紋絲不亂的頭發(fā)上桂肌,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音永淌,去河邊找鬼崎场。 笑死,一個胖子當(dāng)著我的面吹牛遂蛀,可吹牛的內(nèi)容都是我干的谭跨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼答恶,長吁一口氣:“原來是場噩夢啊……” “哼饺蚊!你這毒婦竟也來了萍诱?” 一聲冷哼從身側(cè)響起悬嗓,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裕坊,沒想到半個月后包竹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡籍凝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年周瞎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饵蒂。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡声诸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出退盯,到底是詐尸還是另有隱情彼乌,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布渊迁,位于F島的核電站慰照,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琉朽。R本人自食惡果不足惜毒租,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箱叁。 院中可真熱鬧墅垮,春花似錦惕医、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剃允,卻和暖如春沛简,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斥废。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工椒楣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牡肉。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓捧灰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親统锤。 傳聞我的和親對象是個殘疾皇子毛俏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344