Kotlin+Databinding如何為佈局新增自定義屬性
阿新 • • 發佈:2019-01-11
在使用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
的使用,只要掌握了對應的使用,就可以理解我們對於新增屬性的處理。