熟悉DataBinding的小伙伴都知道膜蠢,使用EditText控件是可以通過使用@={}實(shí)現(xiàn)雙向數(shù)據(jù)綁定障陶,但如果是非官方的輸入控件類呢?答案顯而易見匀哄,是不可以滴秦效,那么我們?nèi)绾螌?shí)現(xiàn)像EditText那樣的雙向數(shù)據(jù)綁定功能雏蛮?接下來為您揭曉。
1. 第一步,getter方法編寫
需要在方法前加入注解@InverseBindingAdapter阱州, attribute表示你要綁定的值名稱挑秉;event表示你要綁定的時(shí)間名稱,可以使用控件的設(shè)置監(jiān)聽事件的方法命名苔货,
@InverseBindingAdapter(attribute = "rate", event = "setOnRatingSliderChangeListener")
@JvmStatic
fun getRating(view: SmileBar):Int{
return view.rating
}
2.第二步犀概,setter方法編寫
這一步很簡(jiǎn)單,主要是為控件賦值夜惭,value需要和上一步的attribute一致姻灶。
@BindingAdapter(value ="rate")
@JvmStatic
fun setRating(view: SmileBar, rate:Int){
view.rating = rate
}
3. 第三步,監(jiān)聽值的變化
這一步主要是讓Databinding知道數(shù)據(jù)發(fā)生變化了诈茧,需要將控件的值逆向輸出木蹬;該方法的第二個(gè)參數(shù)為InverseBindingListener是寫死的,這個(gè)法主要為控件添加監(jiān)聽事件若皱,當(dāng)其變化時(shí)調(diào)用InverseBindingListener的onChange方法镊叁。需要和第一步的event一致。
@BindingAdapter(value = "setOnRatingSliderChangeListener")
@JvmStatic
fun setRatingListener(view:SmileBar, listener: InverseBindingListener){
view.setOnRatingSliderChangeListener(object :SmileBar.OnRatingSliderChangeListener{
override fun onPendingRating(p0: Int) {
}
override fun onFinalRating(p0: Int) {
listener.onChange()
}
override fun onCancelRating() {
}
})
}
4. 使用示例
這是一個(gè)打分控件走触,通過使用@={}晦譬,當(dāng)其等級(jí)變化時(shí),item的rate值會(huì)變得和該控件的rate值相同
<com.eugeneek.smilebar.SmileBar
android:id="@+id/smile_rating"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:smileHeight="@dimen/icon_bar"
app:smileWidth="@dimen/icon_bar"
app:horizontalSpacing="@dimen/interval_text"
app:smileDefault="@drawable/ic_smile"
app:smileRate1="@drawable/ic_smile1"
app:smileRate2="@drawable/ic_smile2"
app:smileRate3="@drawable/ic_smile3"
app:smileRate4="@drawable/ic_smile4"
app:smileRate5="@drawable/ic_smile5"
android:layout_marginLeft="@dimen/interval_medium"
android:layout_toEndOf="@id/tv_label_rate"
app:rate="@={item.rate}"
/>