一、基礎概念
Android數據綁定庫是一種支持庫,使用 XML 布局文件來申明應用程序 UI 組件(如 TextView、ImageView 等)與計算後端邏輯之間的連接。
Databinding 提供了一種自動化的方式將 UI 上的數據綁定到應用邏輯上,以減少使用傳統 findViewById 代碼的頻率,同時減少了大量重複代碼的開發,提高了開發效率。
與傳統的 findViewById 或 ButterKnife 等第三方庫相比,Databinding 具有以下優勢:
- 不需要定義變量或綁定變量,樣板代碼更少。
- 編譯時會生成綁定代碼,避免了運行時反射所帶來的性能問題。
- 減少了Activity和Fragment的代碼量。
二、使用方法
1. 添加依賴
android {
dataBinding {
enabled = true
}
}
dependencies {
...
def databinding_version = "4.2.0"
implementation "com.android.databinding:compiler:$databinding_version"
implementation "androidx.databinding:databinding-common:$databinding_version"
implementation "androidx.databinding:databinding-runtime:$databinding_version"
}
2. 布局文件創建
在需要使用 Databinding 的布局文件中的根布局添加 <layout> 標籤,該布局文件中的其他控件,可以使用該布局文件中的變量進行數據綁定。
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="java.util.List" />
<variable
name="user"
type="com.example.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
</LinearLayout>
</layout>
3. 綁定變量
在 Activity 或 Fragment 中,使用 DataBindingUtil.inflate() 或 DataBindingUtil.setContentView() 方法來獲得與布局文件進行綁定的 Binding 對象。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding =
DataBindingUtil.setContentView(this, R.layout.activity_main)
val user = User("Bob")
binding.user = user
}
}
三、數據綁定
可以在布局文件中使用表達式語言(表達式由 @{} 標籤限定),可以將布局中的控件綁定到變量。表達式語言將在編譯時計算,這與早期的綁定庫不同。
表達式語言可以訪問以下內容:
- 變量
- 變量上的方法
- Layout 上的綁定適配器
- 靜態 Global 方法
<data>
<variable
name="user"
type="com.example.User" />
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
變量 user 的類型是 com.example.User ,可以在表達式中訪問 user 對象的屬性,如 user.name 。
四、事件綁定
可以使用 Databinding 將布局文件中的事件與特定的方法綁定。
在 Android 中, View.OnClickListener 接口被用於處理點擊事件。通過使用 Databinding,可以省略掉這個步驟,並直接將要調用的方法綁定到事件處理程序。要將事件綁定到方法,請將 @{} 表達式添加到布局中的屬性或方法。
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> presenter.onButtonClick()}"
android:text="@string/button_text" />
上面的代碼將按鈕與 presenter.onButtonClick() 方法綁定在一起,當按鈕被點擊時,該方法將被調用。
五、觀察
變量可以成為可觀察的,當變量發生更改時,布局將自動更新。通常,這是通過在變量聲明中添加 Observable 標記來完成的。
<data>
<import type="androidx.databinding.ObservableList" />
<variable
name="users"
type="ObservableList<com.example.User>"
/>
</data>
在上述示例中,變量 users 通過添加 Observable 標籤變為可觀察的。這意味着當 users 變化時,視圖自動更新。
由於 Databinding 支持字段和 map 的綁定,因此還可以通過在關鍵字段上使用 ObservableField 類型來更改單個字段。
@BindingAdapter("android:text")
fun setText(view: TextView, value: String?) {
view.text = value ?: ""
}
class User(val name: ObservableField<String>, val age: ObservableField<Int>) {}
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
在上面的示例中,User 類中的字段在其類型聲明中使用了 ObservableField,並且可以將其直接綁定到布局文件中的字段中。
六、綁定適配器
綁定適配器是一種強大的技術,可用於將 Activity 或 Fragment 中方法的返回值用於數據綁定中的視圖屬性。
@BindingAdapter("imageUrl")
fun setImageUrl(view: ImageView, url: String) {
Glide.with(view.context).load(url).into(view)
}
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:imageUrl="@{user.imageUrl}" />
在上面的示例中,setImageUrl() 方法帶有 @BindingAdapter 注釋,用於將 url 映射到 ImageView 的 imageUrl 屬性。可以通過 app:imageUrl=”@{…}” 將該方法綁定到布局中。
七、總結
本文詳細闡述了 Android 數據綁定的使用方法和優勢,通過布局文件的綁定,可以避免在 Activity 或 Fragment 中編寫冗長的 findViewById 代碼,在大型項目中,可以節省大量時間和精力,提高開發效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/257629.html