我为数据绑定(bind)创建了一个自定义属性,它不需要任何参数,它所做的只是验证 TextinputEditText,但我想不出在 xml 属性中传递 void 参数的方法。
这不会编译。
绑定(bind)适配器.java
@BindingAdapter("app:validator")
public static void textValidator(TextInputLayout textInputLayout) {
doesSomething();
}
布局文件.xml
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:validator="@{ void }">
<android.support.design.widget.TextInputEditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"" />
</android.support.design.widget.TextInputLayout>
我试过在 xml 中传递 void 或 null,但它就是无法编译。 我研究发现方法中至少应该有一个或两个值参数。所以我可以通过传递一个参数来让它工作,比方说一个 boolean 值只是为了传递而不是使用它。例如,
这个编译。但这只是一个 hack,请有人提出更好的方法。
绑定(bind)适配器.java
@BindingAdapter("app:validator")
public static void textValidator(TextInputLayout textInputLayout, boolean bl) {
doesSomething();
}
布局文件.xml
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:validator="@{ booleanVariable }">
<android.support.design.widget.TextInputEditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"" />
</android.support.design.widget.TextInputLayout>
最佳答案
But it's just a hack, someone please suggest a better approach.
没有更好的方法,因为这不是数据绑定(bind)的目的。它的目的是按字面意思绑定(bind)数据,这意味着应该有一些数据(参数)要在 View 中设置,而无需在代码中手动执行。
您尝试执行的操作实际上没有任何意义,因为您的自定义绑定(bind)只会在您传递要绑定(bind)到给定 View 的数据时才会被评估。因此,您最终会得到传递一些虚拟值以触发验证的代码,此时您还不如自己手动触发验证,这比像这样通过数据绑定(bind)间接执行要清晰得多。
如果您想要验证您的 View 以响应另一个 View 上的某些事件,比如“提交按钮”点击或其他东西,那么您可以将事件处理程序绑定(bind)到那个控件,这反过来会调用您的 doesSomething()
方法。查看section on event handling in the data binding documentation为此。
希望对您有所帮助。
关于java - 带有 void 参数的 Android 数据绑定(bind)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48610045/