如何在Android中为双向数据绑定制作一个合适的绑定适配器



我正试图在我的Android应用程序中创建一个页面,允许用户在EditText中输入Float值,并将该值绑定到我的视图模型。这是我当前绑定适配器的代码:

import android.text.SpannableStringBuilder
import android.widget.EditText
import androidx.databinding.BindingAdapter
import androidx.databinding.InverseBindingAdapter
@BindingAdapter("android:text")
fun setText(view: EditText, value: Float?) {
view.text = value?.let { SpannableStringBuilder(value.toString()) } ?: SpannableStringBuilder("")
}
@InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")
fun getTextString(view: EditText): Float? {
val editTextString: String? = view.text?.toString()
return if(editTextString == null || editTextString == "") 0.0f else editTextString.toString().toFloat()
}

这是我在布局文件中的EditText的代码:

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/amount_edit_text_outer"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="@dimen/edit_text_width"
android:layout_height="@dimen/edit_text_height"
android:layout_gravity="center"
android:hint="@string/edit_text_hint"
app:layout_constraintBottom_toTopOf="@+id/fab"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/amount_edit_text_inner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@={viewmodel.liveAmount$app_debug}"
android:inputType="numberDecimal" />
</com.google.android.material.textfield.TextInputLayout>

最后,我的视图模型实时数据变量如下所示:

internal val liveAmount = MutableLiveData<Float>(0.0f)

我还应该补充一点,当我在手机上运行此代码时,它允许我在EditText中输入第一个数字,而不允许输入其他数字。此外,键盘不会消失,除非我杀死应用程序。欢迎提出任何问题或意见。谢谢大家的帮助!

尝试更改此项:

@InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")

至:

@InverseBindingAdapter(attribute = "android:text")

并添加其他方法:

// This notifies the data binding system that the attribute value has changed.
@BindingAdapter("android:textAttrChanged")
fun setTextChangedListener(editText: TextInputEditText, listener: InverseBindingListener) {
editText.addTextChangedListener(object: TextWatcher{
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
listener.onChange()
}
})
}

这还没有经过测试,但它应该是有效的,或者至少是接近的。其他类似示例请参见此处:

https://github.com/gavingt/upcoming-games/blob/adc8b7e67b1e05d7bc9ac6247b82cfa93a43a26f/app/src/main/java/com/gavinsappcreations/upcominggames/utilities/BindingAdapters.kt#L324

相关内容

最新更新