[android]data binding 3 - Two-way data binding & BindingAdapter example EditText
ViewModel
class ViewModel() : ViewModel() {
//EditText support String simple
private val _text = MutableLiveData(String)
val text: LiveData = _text
//EditText not support Int need BindingAdapter
private val _num = MutableLiveData(String)
val num: LiveData = _num
layout
<data>
<variable
name="viewmodel"
type="com.test.test.ViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
...
//one way '{data}'
<EditText
android:text='@{viewmodel.text}'
/>
//two way insert `={data}'
<EditText
android:text='@={viewmodel.text}'
/>
//two way & BindingAdapter
<EditText
android:text='@={viewmodel.num}'
/>
BindingAdapter
// object name is user define
object EditTextDataBindingAdapter{
//one way BindingAdapter send view
//need to static
@JvmStatic
//binding target "android:text"
@BindingAdapter("android:text")
// function name is user define
fun setText(view: TextView, text: Int)
{
view.text = text.toString()
}
//tow way BindingAdapter from view
@JvmStatic
//binding target event = attribute = "android:text", event = "android:textAttrChanged")
@InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")
fun getText(view: TextView): Int {
return view.text.toString().toIntOrNull() ?: 0
}
}
//if need more type BindingAdapter then make at tanother object
//because error conflicting overloads
object EditTextDataBindingAdapter2{
}
Next