是什么?
在布局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<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<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)}"