1. 程式人生 > >Kotlin+Databinding如何為佈局新增自定義屬性

Kotlin+Databinding如何為佈局新增自定義屬性

在使用databinding時,我們經常會遇到需要對圖片進行自定義的屬性新增,以實現網路圖片的自動載入和處理,這種處理在jiava中的話在對應的ViewModel中新增靜態方法,就可以實現對應的處理,但是遷移到Kotlin之後,你會發現這種方法不好用了,那麼我們應該怎麼辦呢?
如下面的佈局檔案:

<?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"
        tools:context="com.ziank.novelreader.activities.BookPageActivity">
<data>
        <variable
            name="book"
            type="com.ziank.novelreader.view_models.BookPageViewModel"/>
</data>
...
<ImageView
            android:id="@+id/book_cover"
            android:layout_width="80dp"
            android:layout_height="100dp"
            android:layout_marginStart="15dp"
            android:layout_marginTop="15dp"
            app:imageUrl="@{book.coverUrl}"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toBottomOf="@id/toolbar"
            app:srcCompat="@drawable/booklist" />
...
</xml>

對於book的封面,我們新增了一個屬性為imageUrl的屬性,值繫結到了book.coverUrl,那麼我們就需要新增一個方法對它進行處理。由於直接在ViewModel中新增方法不可用,我們就用到了DataBindingComponent了。DataBindingComponent用在生成DataBinding時,也就是繫結view之時,此時可以指定使用我們生成的DataBindingComponent的子類物件,而在DataBindingComponent中處理新增屬性的處理。
如下面的所示:

class MyComponent:DataBindingComponent {
    override fun getMyComponent(): MyComponent {
        return MyComponent()
    }

    @BindingAdapter("imageUrl")
    fun loadImage(view: ImageView, imageUrl: String) {
        Picasso.with(view.context)
                .load(imageUrl)
                .placeholder(R.drawable.book_cover)
                .into(view)
    }
}

在生成DataBinding的時候程式碼如下:

val binding = DataBindingUtil.setContentView<ActivityBookPageBinding>(this, R.layout
                .activity_book_page, MyComponent.getMyComponent())
binding.book = mBookModel

這樣就可以實現對於封面的處理了。其實主要就是對於DataBindingComponent的使用,只要掌握了對應的使用,就可以理解我們對於新增屬性的處理。