Databinding使用篇一

是什么?

在布局xml中將控件和數(shù)據(jù)進(jìn)行綁定,使數(shù)據(jù)變化可以驅(qū)動(dòng)控件改變九榔,控件改變可以驅(qū)動(dòng)數(shù)據(jù)改變。

減少了Activity中對(duì)控件的初始化涡相、設(shè)置監(jiān)聽哲泊、顯示數(shù)據(jù)等操作

使用databinding你就不需要使用findviewbyid()、setText()等

怎么用

使用入門

配置開關(guān)在app\build\android 下開啟databinding開關(guān)

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    dataBinding {
        enabled = true
    }
}

布局xml 利用快捷鍵alt+enter 將布局轉(zhuǎn)換成layout格式的漾峡,使用格式是 @{}

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="user"
            type="com.example.hellojetpack.databinding.UserBean" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:textSize="28sp"
            android:text="@{user.name}"
            />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
//Activity中設(shè)置 setContentView  并給布局中變量user 賦值
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding = DataBindingUtil.setContentView<ActivityDatabindingBinding>(
        this,
        R.layout.activity_databinding
    )
    //給xml中的對(duì)象賦值
    binding.user = UserBean("DataBinding",2)
}

布局和綁定表達(dá)式

數(shù)據(jù)對(duì)象

data class User(val firstName: String, val lastName: String)    

綁定數(shù)據(jù)

系統(tǒng)會(huì)為每個(gè)布局文件生成一個(gè)綁定類攻旦。例如布局文件名為 activity_main.xml喻旷,因此生成的對(duì)應(yīng)類為 ActivityMainBinding生逸。

綁定數(shù)據(jù)方式一

val binding: ActivityMainBinding = DataBindingUtil.setContentView(
                this, R.layout.activity_main)
binding.user = User("Test", "User")

綁定數(shù)據(jù)方式二

val binding: ActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater())
//注意需要設(shè)置setContentview
setContentView(binding.root)

綁定數(shù)據(jù)方式三

如果您要在Fragment、ListView 或 RecyclerView 適配器中使用數(shù)據(jù)綁定項(xiàng)

val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
//or
val view = inflater.inflate(getSubLayoutId(), container, false)
binding = DataBindingUtil.bind<T>(view)

常用功能

表達(dá)式語(yǔ)言與托管代碼中的表達(dá)式非常相似。您可以在表達(dá)式語(yǔ)言中使用以下運(yùn)算符和關(guān)鍵字:

  • 算術(shù)運(yùn)算符+ - / * %
  • 字符串連接運(yùn)算符+
  • 邏輯運(yùn)算符&& ||
  • instanceof
  • 三元運(yùn)算符?:

例子

android:text='@{user.age>13 ? user.name:user.name+"-s"}'

Null快捷表達(dá)式

如果左邊運(yùn)算數(shù)不是 null槽袄,則 Null 合并運(yùn)算符 (??) 選擇左邊運(yùn)算數(shù)烙无,如果左邊運(yùn)算數(shù)為 null,則選擇右邊運(yùn)算數(shù)

android:text="@{user.displayName ?? user.lastName}"

功能等效于

android:text="@{user.displayName != null ? user.displayName : user.lastName}"

避免出現(xiàn)null問題

生成的數(shù)據(jù)綁定代碼會(huì)自動(dòng)檢查有沒有 null 值并避免出現(xiàn) Null 指針異常遍尺。例如截酷,在表達(dá)式 @{user.name} 中,如果 user 為 Null乾戏,則為 user.name 分配默認(rèn)值 null迂苛。如果您引用 user.age,其中 age 的類型為 int鼓择,則數(shù)據(jù)綁定使用默認(rèn)值 0三幻。

屬性引用

android:text="@{user.lastName}"

視圖引用

<EditText       
    android:id="@+id/example_text" 
    android:layout_height="wrap_content"       
    android:layout_width="match_parent"
/>   

<TextView       
    android:id="@+id/example_output"       
    android:layout_width="wrap_content"       
    android:layout_height="wrap_content"       
    android:text="@{exampleText.text}"
/>

注意:綁定類將 ID 轉(zhuǎn)換為駝峰式大小寫。

集合

<data>
    <import type="android.util.SparseArray"/>
    <import type="java.util.Map"/>
    <import type="java.util.List"/>
    <variable name="list" type="List&lt;String>"/>
    <variable name="sparse" type="SparseArray&lt;String>"/>
    <variable name="map" type="Map&lt;String, String>"/>
    <variable name="index" type="int"/>
    <variable name="key" type="String"/>
</data>
…
android:text="@{list[index]}"
…
android:text="@{sparse[index]}"
…
android:text="@{map[key]}"

注意

  • 引入 <import type="java.util.List"/>
  • 泛型 <variable name="list" type="List<String>"/> “<” 符號(hào)用< 代替
  • 調(diào)用 list[ ] "@{list[index]}"

字符串使用

您可以使用單引號(hào)括住特性值呐能,這樣就可以在表達(dá)式中使用雙引號(hào)念搬,如以下示例所示:

android:text='@{map["firstName"]}'

也可以使用雙引號(hào)括住特性值。如果這樣做摆出,則還應(yīng)使用反單引號(hào) 將字符串字面量括起來:

android:text="@{map[`firstName`]}"

資源引用

資源引用再xml中不能自動(dòng)適配朗徊,可能需要自己手動(dòng)賦值粘貼

android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"    

//根據(jù)條件選擇
<variable
    name="large"
    type="boolean" />
    
android:padding="@{large? (int)@dimen/largePadding : (int)@dimen/smallPadding}"

<variable
    name="firstName"
    type="String" />

<variable
    name="lastName"
    type="String" />
    
<string name="nameFormat">Full Name: %1$s:%2$s</string>

android:text="@{@string/nameFormat(firstName,lastName)}"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市偎漫,隨后出現(xiàn)的幾起案子爷恳,更是在濱河造成了極大的恐慌,老刑警劉巖象踊,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舌仍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡通危,警方通過查閱死者的電腦和手機(jī)铸豁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菊碟,“玉大人节芥,你說我怎么就攤上這事∧婧Γ” “怎么了头镊?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)魄幕。 經(jīng)常有香客問我相艇,道長(zhǎng),這世上最難降的妖魔是什么纯陨? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任坛芽,我火速辦了婚禮留储,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咙轩。我一直安慰自己获讳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布活喊。 她就那樣靜靜地躺著丐膝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钾菊。 梳的紋絲不亂的頭發(fā)上帅矗,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音煞烫,去河邊找鬼损晤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛红竭,可吹牛的內(nèi)容都是我干的尤勋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茵宪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼最冰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稀火,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤暖哨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凰狞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篇裁,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年赡若,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了达布。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逾冬,死狀恐怖黍聂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情身腻,我是刑警寧澤产还,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站嘀趟,受9級(jí)特大地震影響脐区,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜她按,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一牛隅、第九天 我趴在偏房一處隱蔽的房頂上張望炕柔。 院中可真熱鬧,春花似錦倔叼、人聲如沸汗唱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至授霸,卻和暖如春巡验,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碘耳。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工显设, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辛辨。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓捕捂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親斗搞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子指攒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354