欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)Jetpack組件DataBinding用例詳解

 更新時間:2022年02月09日 14:22:02   作者:Alpinist?Wang  
這篇文章主要為大家介紹了Android開發(fā)Jetpack組件DataBinding的使案用例詳解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

簡介

DataBinding 是 Jetpack 組件之一,適用于 MVVM 模式開發(fā),也是Google官方推薦使用的組件之一。使用DataBinding可以很容易的達到視圖與邏輯分離,直接在布局中綁定數(shù)據(jù),并且數(shù)據(jù)改變時自動更新UI,不再需要在業(yè)務代碼中綁定數(shù)據(jù)。

本文結(jié)合Google官方提供的DataBinding使用示例講解,Google官方sample地址:

https://github.com/googlesamples/android-databinding

其中包含兩個工程,本文使用的BasicSample工程。

使用方式

1. build.gradle 中添加 kapt,并啟用dataBinding

在app模塊的build.gradle文件中,添加:

apply plugin: 'kotlin-kapt'
android {
    ...
    dataBinding {
        enabled true
    }
}

其中,apply plugin: 'kotlin-kapt'是為了在Kotlin中使用BindingAdapter注解。

2.修改布局文件,添加 layout 和 data 標簽

使用DataBinding的布局文件與普通的布局文件有些不同,在布局外需要包裹一層<layout>,并添加<data>標簽,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">
    <data/>
    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

<data>標簽是用來添加數(shù)據(jù)的,初次使用,先保持為空即可。<data>標簽之后就是正常的布局代碼,與普通的布局代碼一模一樣。
接下來,我們在activity_main布局中添加兩個按鈕:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">
    <data/>
    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <Button
                android:id="@+id/observable_fields_activity_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="Observable Fields activity"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>
        <Button
                android:id="@+id/viewmodel_activity_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="ViewModel activity"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@id/observable_fields_activity_button"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

寫好布局文件后rebuild project,這時generatedJava文件夾下會自動生成databinding需要用到的文件。

3.使用 DataBindingUtil 綁定布局

由于使用了DataBinding布局,所以我們需要用DataBindingUtil綁定布局,而不是直接使用setContentView。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 因為使用了dataBinding布局,所以這里需要用DataBindingUtil來設(shè)置布局
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        // 返回的binding擁有布局中所有的View,使用id引用即可
        binding.observableFieldsActivityButton.setOnClickListener {
            startActivity(Intent(this, ObservableFieldActivity::class.java))
        }
        binding.viewmodelActivityButton.setOnClickListener {
            startActivity(Intent(this, ViewModelActivity::class.java))
        }
    }
}

返回的Binding類型跟布局文件名有關(guān),規(guī)則是布局文件名去掉下劃線,改成駝峰命名,再添加Binding后綴。比如本例中使用的布局文件是activity_main.xml,所以返回的Binding類型就是ActivityMainBinding。
返回的binding中擁有布局中的所有View,使用id即可引用,這里我們給兩個按鈕添加了兩個點擊事件,點擊跳轉(zhuǎn)至另外兩個Activity。這里我們先新建兩個空的Activity,命名為ObservableFieldActivity和ViewModelActivity,后面我們會修改這兩個Activity的內(nèi)容。注意由于使用了DataBinding布局,所以Kotlin直接用id引用View的特性不可用了。

4.布局的 data 標簽中添加數(shù)據(jù)變量,并使用其參數(shù)

<layout>中的<data>用來定義需要綁定的數(shù)據(jù),我們先新建一個數(shù)據(jù)類ObservableFieldProfile:

data class ObservableFieldProfile(
        val name: String,
        val lastName: String
)

這是一個表示個人信息的類,name表示名字,lastName表示姓氏。

在ObservableFieldActivity的布局文件中,使用此類定義一個user變量:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">
    <data>
        <import type="com.example.studydatabinding.data.ObservableFieldProfile"/>

        <variable
                name="user"
                type="ObservableFieldProfile"/>
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".ui.ObservableFieldActivity">

        <TextView
                android:id="@+id/name_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="8dp"
                android:text="Name"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>
        <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="@{user.name}"
                app:layout_constraintStart_toStartOf="@id/name_label"
                app:layout_constraintTop_toBottomOf="@id/name_label"/>
        <TextView
                android:id="@+id/lastname_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="Last Name"
                app:layout_constraintStart_toStartOf="@id/name"
                app:layout_constraintTop_toBottomOf="@id/name"/>
        <TextView
                android:id="@+id/lastname"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="@{user.lastName}"
                app:layout_constraintStart_toStartOf="@id/lastname_label"
                app:layout_constraintTop_toBottomOf="@id/lastname_label"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

<data>中的import標簽用于導入使用的類,type表示類的完整路徑,<variable>標簽用于定義變量,name表示變量名,type表示變量類型。在此例中,我們定義了一個類型為ObservableFieldProfile的user變量。
使用此變量的方式也很簡單,在布局文件中,使用@{user.name}即可使用user變量的name參數(shù),使用@{user.lastName}即可使用user變量的lastName參數(shù)??梢钥吹剑覀兘o兩個TextView的android:text屬性設(shè)置了user的這兩個參數(shù)。

同樣的,寫好布局文件后需要rebuild Project。

在ObservableFieldActivity中,使用DataBindingUtil設(shè)置布局,并且給返回的binding變量設(shè)置user參數(shù),代碼如下:

class ObservableFieldActivity : AppCompatActivity() {
    private val observableFieldProfile = ObservableFieldProfile("Alpinist", "Wang")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityObservableFieldBinding = DataBindingUtil.setContentView(this, R.layout.activity_observable_field)
        binding.user = observableFieldProfile
    }
}

使用binding.user給DataBinding布局中的user變量賦值。
此時,運行程序,顯示如下:

可以看到,我們綁定的user變量已經(jīng)成功顯示出來了。

不過此時user變量變化時,UI還不能自動刷新。如果需要UI隨著變量自動刷新,需要將String類型換成ObservableField<String>類型。如果是int型變量,需要替換成ObservableField<Int>類型,它等同于ObservableInt類型,我們以ObservableInt類型為例,在ObservableFieldProfile類中新增likes變量,:

data class ObservableFieldProfile(
    val name: String,
    val lastName: String,
    val likes: ObservableInt
)

修改布局文件activity_observable_field.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">
    ...
    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        ...
        <TextView
        		android:id="@+id/likes_label"
                android:text="Like"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                android:layout_marginEnd="8dp"
                android:layout_marginTop="8dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <TextView
                android:id="@+id/likes"
                app:layout_constraintTop_toBottomOf="@id/likes_label"
                app:layout_constraintStart_toStartOf="@id/likes_label"
                app:layout_constraintEnd_toEndOf="@id/likes_label"
                android:text="@{Integer.toString(user.likes)}"
                android:layout_marginTop="8dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <Button
                android:id="@+id/like_button"
                app:layout_constraintTop_toBottomOf="@id/likes"
                app:layout_constraintEnd_toEndOf="parent"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="8dp"
                android:text="Like"
                android:onClick="onLike"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

我們在布局中添加了一個按鈕,點擊一次觸發(fā)onLike方法,還添加了一個顯示likes數(shù)量的TextView,由于likes是一個Int型變量,所以我們用Integer.toString()方法將其轉(zhuǎn)換為了String。

修改ObservableFieldActivity:

class ObservableFieldActivity : AppCompatActivity() {
    private val observableFieldProfile = ObservableFieldProfile("Alpinist", "Wang", ObservableInt(0))
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityObservableFieldBinding =
            DataBindingUtil.setContentView(this, R.layout.activity_observable_field)
        binding.user = observableFieldProfile
    }
    fun onLike(view: View) {
        observableFieldProfile.likes.increment()
    }
}
fun ObservableInt.increment() {
    set(get() + 1)
}

我們在此Activity中添加了onLike()方法,前文已說到,點擊按鈕一次便會觸發(fā)一次onLike方法,在此方法中,我們將user的likes變量增加1。其中拓展的increment函數(shù)主要是為了方便調(diào)用。
此時,運行程序,效果如下:

為了讓效果更加酷炫一點,順便復習一下上面學到的內(nèi)容,我們在布局中添加一個ImageView和一個ProgressBar:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">
    <data>
        <import type="com.example.studydatabinding.data.ObservableFieldProfile"/>
        <import type="android.view.View"/>
        <variable
                name="user"
                type="ObservableFieldProfile"/>
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".ui.ObservableFieldActivity">
        <TextView
                android:id="@+id/name_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="8dp"
                android:text="Name"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>
        <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="@{user.name}"
                app:layout_constraintStart_toStartOf="@id/name_label"
                app:layout_constraintTop_toBottomOf="@id/name_label"/>
        <TextView
                android:id="@+id/lastname_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="Last Name"
                app:layout_constraintStart_toStartOf="@id/name"
                app:layout_constraintTop_toBottomOf="@id/name"/>
        <TextView
                android:id="@+id/lastname"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="@{user.lastName}"
                app:layout_constraintStart_toStartOf="@id/lastname_label"
                app:layout_constraintTop_toBottomOf="@id/lastname_label"/>
        <ImageView
                android:minHeight="48dp"
                android:minWidth="48dp"
                android:id="@+id/imageView"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:layout_marginEnd="24dp"
                android:layout_marginTop="24dp"
                android:tint="@{user.likes > 9 ? @android:color/holo_red_light : @android:color/black}"
                android:src="@{user.likes < 4 ? @drawable/ic_person_black_96dp : @drawable/ic_whatshot_black_96dp}"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <TextView
                android:text="Like"
                app:layout_constraintEnd_toEndOf="@id/imageView"
                app:layout_constraintTop_toBottomOf="@id/imageView"
                app:layout_constraintStart_toStartOf="@id/imageView"
                android:layout_marginEnd="8dp"
                android:layout_marginTop="8dp"
                android:id="@+id/likes_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <TextView
                android:id="@+id/likes"
                app:layout_constraintTop_toBottomOf="@id/likes_label"
                app:layout_constraintStart_toStartOf="@id/likes_label"
                app:layout_constraintEnd_toEndOf="@id/likes_label"
                android:text="@{Integer.toString(user.likes)}"
                android:layout_marginTop="8dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <Button
                android:id="@+id/like_button"
                app:layout_constraintTop_toBottomOf="@id/likes"
                app:layout_constraintEnd_toEndOf="@id/likes"
                app:layout_constraintStart_toStartOf="@id/likes"
                android:layout_marginTop="8dp"
                android:text="Like"
                android:onClick="onLike"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <ProgressBar
                android:layout_width="0dp"
                app:layout_constraintStart_toStartOf="@id/like_button"
                app:layout_constraintEnd_toEndOf="@id/like_button"
                app:layout_constraintTop_toBottomOf="@id/like_button"
                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                android:visibility="@{user.likes > 0 ? View.VISIBLE : View.GONE}"
                android:layout_marginTop="8dp"
                android:layout_height="wrap_content"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

其中的兩張Vector圖片代碼如下:

ic_whatshot_black_96dp.xml:

<vector android:height="96dp" android:viewportHeight="24.0"
    android:viewportWidth="24.0" android:width="96dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FF000000" android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

ic_whatshot_black_96dp.xml:

<vector android:height="96dp" android:viewportHeight="24.0"
    android:viewportWidth="24.0" android:width="96dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FF000000" android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

主要添加的邏輯有:

  • 如果user.likes大于9,ImageView顯示紅色,否則顯示黑色。
  • 如果user.likes小于4,ImageView顯示ic_person_black_96dp圖片,否則顯示ic_whatshot_black_96dp圖片。注意不能直接使用>、<符號,需要用轉(zhuǎn)義字符&gt;、&lt;代替。
  • 如果user.likes大于0,顯示ProgressBar,否則隱藏ProgressBar

此時,運行代碼,效果如下:

5.BindingAdapter的使用

BindingAdapter是用來拓展屬性的,新建一個BindingAdapters類,添加以下代碼:

object BindingAdapters {
    @BindingAdapter("hideIfZero")
    @JvmStatic
    fun hideIfZero(view: View, number: Int) {
        view.visibility = if (number == 0) View.GONE else View.VISIBLE
    }
}

寫好后,rebuild project,然后就可以在布局文件中,對View使用hideIfZero屬性了。BindingAdapter中的參數(shù)表示屬性名字,函數(shù)中的第一個參數(shù)表示View類型,后面的參數(shù)表示屬性的值。
BindingAdapter中的屬性名字可以添加命名空間前綴,例如可以寫作app:hideIfZero,不過這樣的話在xml中就只能使用app:前綴了。如果像上例中一樣,在BindingAdapter中不添加命名空間前綴,那么在xml中可以直接使用hideIfZero或者其他任何除android:外的前綴,比如app:hideIfZero,whatever:hideIfZero等等。
在BindingAdapter中再添加幾個擴展屬性:

object BindingAdapters {
    @BindingAdapter("popularityIcon")
    @JvmStatic
    fun popularityIcon(view: ImageView, popularity: Popularity) {
        val color = getAssociateColor(popularity, view.context)
        ImageViewCompat.setImageTintList(view, ColorStateList.valueOf(color))
        view.setImageDrawable(getDrawablePopularity(popularity, view.context))
    }
    @BindingAdapter("progressTint")
    @JvmStatic
    fun tintPopularity(view: ProgressBar, popularity: Popularity) {
        val color = getAssociateColor(popularity, view.context)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            view.progressTintList = ColorStateList.valueOf(color)
        }
    }
    @BindingAdapter("progressScaled", "android:max")
    @JvmStatic
    fun setProgress(progressBar: ProgressBar, likes: Int, max: Int) {
        progressBar.progress = (likes * max / 5).coerceAtMost(max)
    }
    @BindingAdapter("hideIfZero")
    @JvmStatic
    fun hideIfZero(view: View, number: Int) {
        view.visibility = if (number == 0) View.GONE else View.VISIBLE
    }
    private fun getAssociateColor(popularity: Popularity, context: Context): Int {
        return when (popularity) {
            Popularity.POPULAR -> ContextCompat.getColor(context, R.color.popular)
            Popularity.STAR -> ContextCompat.getColor(context, R.color.star)
            else -> Color.BLACK
        }
    }
    private fun getDrawablePopularity(popularity: Popularity, context: Context): Drawable? {
        return ContextCompat.getDrawable(
            context, when (popularity) {
                Popularity.NORMAL -> R.drawable.ic_person_black_96dp
                else -> R.drawable.ic_whatshot_black_96dp
            }
        )
    }

}

從setProgress方法可以看出,如果需要獲取xml中其他的屬性值,在BindingAdapter中添加對應的屬性名,再在函數(shù)中添加對應的參數(shù)即可。
其中的Popularity類如下:

enum class Popularity {
    NORMAL,
    POPULAR,
    STAR
}

編輯activity_view_model,使用上面定義的自定義屬性:

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

    <data>
        <import type="com.example.studydatabinding.data.ProfileLiveDataViewModel"/>
        <variable
                name="viewmodel"
                type="ProfileLiveDataViewModel"/>
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".ui.ViewModelActivity">
        <TextView
                android:id="@+id/name_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="8dp"
                android:text="@string/name_label"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>
        <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="@{viewmodel.name}"
                app:layout_constraintStart_toStartOf="@id/name_label"
                app:layout_constraintTop_toBottomOf="@id/name_label"/>
        <TextView
                android:id="@+id/lastname_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="@string/last_name_label"
                app:layout_constraintStart_toStartOf="@id/name"
                app:layout_constraintTop_toBottomOf="@id/name"/>
        <TextView
                android:id="@+id/lastname"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="@{viewmodel.lastName}"
                app:layout_constraintStart_toStartOf="@id/lastname_label"
                app:layout_constraintTop_toBottomOf="@id/lastname_label"/>
        <ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="24dp"
                android:layout_marginEnd="24dp"
                android:contentDescription="@string/profile_avatar_cd"
                android:minWidth="48dp"
                android:minHeight="48dp"
                app:popularityIcon="@{viewmodel.popularity}"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>
        <TextView
                android:id="@+id/likes_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/likes"
                app:layout_constraintEnd_toEndOf="@id/imageView"
                app:layout_constraintStart_toStartOf="@id/imageView"
                app:layout_constraintTop_toBottomOf="@id/imageView"/>
        <TextView
                android:id="@+id/likes"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{Integer.toString(viewmodel.likes)}"
                app:layout_constraintEnd_toEndOf="@id/likes_label"
                app:layout_constraintStart_toStartOf="@id/likes_label"
                app:layout_constraintTop_toBottomOf="@id/likes_label"/>
        <Button
                android:id="@+id/like_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:onClick="@{() -> viewmodel.onLike()}"
                android:text="@string/like"
                app:layout_constraintEnd_toEndOf="@id/likes"
                app:layout_constraintStart_toStartOf="@id/likes"
                app:layout_constraintTop_toBottomOf="@id/likes"/>
        <ProgressBar
                android:id="@+id/progressBar"
                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                android:layout_width="0dp"
                app:progressTint="@{viewmodel.popularity}"
                app:progressScaled="@{viewmodel.likes}"
                android:max="@{100}"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                app:hideIfZero="@{viewmodel.likes}"
                app:layout_constraintEnd_toEndOf="@id/like_button"
                app:layout_constraintStart_toStartOf="@id/like_button"
                app:layout_constraintTop_toBottomOf="@id/like_button"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

其中的ProfileLiveDataViewModel類如下:

class ProfileLiveDataViewModel : ViewModel() {
    private val _name = MutableLiveData("Alpinist")
    private val _lastName = MutableLiveData("Wang")
    private val _likes = MutableLiveData(0)
    val name: LiveData<String> = _name
    val lastName: LiveData<String> = _lastName
    val likes: LiveData<Int> = _likes
    val popularity: LiveData<Popularity> = Transformations.map(_likes) {
        when {
            it > 9 -> Popularity.STAR
            it > 4 -> Popularity.POPULAR
            else -> Popularity.NORMAL
        }
    }
    fun onLike(){
        _likes.value = _likes.value?.inc()
    }
}

LiveData也是jetpack組件之一,其原理和ObservableField是類似的,都是屬于可觀測的屬性。
編輯ViewModelActivity:

class ViewModelActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val viewModel = ViewModelProviders.of(this).get(ProfileLiveDataViewModel::class.java)
        val binding: ActivityViewModelBinding = DataBindingUtil.setContentView(this, R.layout.activity_view_model)
        binding.viewmodel = viewModel
        binding.lifecycleOwner = this
    }
}

此時,運行程序,顯示如下:

以上就是Android開發(fā)Jetpack組件DataBinding用例詳解的詳細內(nèi)容,更多關(guān)于Android開發(fā)Jetpack組件DataBinding的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android巧用XListView實現(xiàn)萬能下拉刷新控件

    Android巧用XListView實現(xiàn)萬能下拉刷新控件

    這篇文章主要為大家詳細介紹了Android巧用XListView實現(xiàn)萬能下拉刷新控件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android中定時執(zhí)行任務的3種實現(xiàn)方法(推薦)

    Android中定時執(zhí)行任務的3種實現(xiàn)方法(推薦)

    下面小編就為大家?guī)硪黄狝ndroid中定時執(zhí)行任務的3種實現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Android fragment實現(xiàn)按鈕點擊事件的示例講解

    Android fragment實現(xiàn)按鈕點擊事件的示例講解

    下面小編就為大家分享一篇Android fragment實現(xiàn)按鈕點擊事件的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • android獲取屏幕像素思路及代碼

    android獲取屏幕像素思路及代碼

    本文為大家詳細介紹下android是怎樣獲取屏幕像素的,感興趣的各位可以參考下哈,希望對你學習android有所幫助
    2013-04-04
  • Android Service服務不被停止詳解及實現(xiàn)

    Android Service服務不被停止詳解及實現(xiàn)

    這篇文章主要介紹了Android Service服務不被停止詳解及實現(xiàn)的相關(guān)資料,有很多應用在設(shè)置運行中會被直接停止掉,這里就提供一個方法一直運行,需要的朋友可以參考下
    2016-11-11
  • android實現(xiàn)多點觸摸應用

    android實現(xiàn)多點觸摸應用

    這篇文章主要為大家詳細介紹了android實現(xiàn)多點觸摸應用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android游戲開發(fā)之黑白棋

    Android游戲開發(fā)之黑白棋

    本文主要介紹Android黑白棋游戲?qū)崿F(xiàn)過程及代碼解析,將著重介紹黑白棋實現(xiàn)過程中用到的算法。對于Android游戲開發(fā)很有幫助。
    2016-08-08
  • Android圖片加載案例分享

    Android圖片加載案例分享

    這篇文章主要為大家分享了Android圖片加載的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android支付寶支付開發(fā)實例

    Android支付寶支付開發(fā)實例

    這篇文章主要為大家詳細介紹了Android支付寶支付開發(fā)實例的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android自定義加載loading view動畫組件

    Android自定義加載loading view動畫組件

    這篇文章主要為大家詳細介紹了Android自定義加載loading view動畫組件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評論