data-binding - Kotlin 2路绑定自定义视图
问题描述
我有 1 个扩展 ConstraintLayout 并包含 1 个 EditText 和 2 个 TextViews 的自定义视图
在我的自定义视图中,我定义了这个 attr (和其他):
<attr name="Text" format="string" />
我像这样使用它:
app:Text="@={login.email}"
在我的自定义视图中,我定义:
companion object {
@JvmStatic @BindingAdapter("Text")
fun setText(nMe : View, nText: String) {
nMe.nInput.setText(nText)
}
@InverseBindingAdapter(attribute = "Text")
fun getText(nMe : View) : String {
return nMe.nInput.text.toString()
}
女巫在单向绑定中工作正常
app:Text="@{login.email}"
但是当我尝试在 2 向绑定中使用它时,我得到指向 ActivityLoginBinding.java java.lang.String callbackArg_0 = mBindingComponent.null.getText(mEmail); 的错误。
怎么做才能获得2路绑定?
LE:经过一些研究,我最终得到了这个:
@InverseBindingMethods(InverseBindingMethod(type =
CustomInput::class,attribute = "bind:Text",event =
"bind:textAttrChanged",method = "bind:getText"))
class CustomEditTextBinder {
companion object {
@JvmStatic
@BindingAdapter(value = ["textAttrChanged"])
fun setListener(editText: CustomInput, listener: InverseBindingListener?) {
if (listener != null) {
editText.nInput.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
}
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
}
override fun afterTextChanged(editable: Editable) {
listener.onChange()
}
})
}
}
@JvmStatic
@InverseBindingAdapter(attribute = "Text")
fun getText(nMe: CustomInput): String {
return nMe.nInput.text.toString()
}
@JvmStatic
@BindingAdapter("Text")
fun setText(editText: CustomInput, text: String?) {
text?.let {
if (it != editText.nInput.text.toString()) {
editText.nInput.setText(it)
}
}
}
}
}
但现在我得到: 找不到事件 TextAttrChanged
解决方案
我想你所需要的只是event = "android:textAttrChanged"
.
String
这对我有用(如果文本为 0,则将文本设置为空):
object DataBindingUtil {
@BindingAdapter("emptyIfZeroText")
@JvmStatic
fun setText(editText: EditText, text: String?) {
if (text == "0" || text == "0.0") editText.setText("") else editText.setText(text)
}
@InverseBindingAdapter(attribute = "emptyIfZeroText", event = "android:textAttrChanged")
@JvmStatic
fun getText(editText: EditText) = editText.text.toString()
}
推荐阅读
- java - 正则表达式验证必须包含至少两个非字母字符的八个或更多字符字符串
- javascript - Get the nearby objects of array item
- java - 在类内部创建对象但在外部方法与在方法内部创建对象有什么区别
- airflow - 如何防止追赶 DAG?
- javascript - 除了用连字符分隔的拆分之外,查找字符串大小的方法?
- java - java - 如何在java中使用数组if else和foreach创建方法
- angular - when using [(ngModel)] directive, what is the event expression called to detect change?
- tensorflow - Jetson TX2 tensorflow per_process_gpu_memory_fraction variable cannot set to 1.0
- node.js - How to make your own push notification service for your website
- c# - 未找到 Http Post 500 错误