带有void参数的Android Data Binding属性

时间:2018-02-04 15:59:52

标签: java android android-databinding

我为数据绑定创建了一个自定义属性,它不需要任何参数,它所做的就是使用TextinputEditText,但我无法找到在xml属性中传递void参数的方法。 / p>

这不会编译。

BindingAdapter.java

@BindingAdapter("app:validator")
public static void textValidator(TextInputLayout textInputLayout) {

        doesSomething();
}

layout_file.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但它只是没有编译。 我研究并发现该方法中至少应该有一个或两个值参数。所以我可以通过传递参数使其工作,让我们说一个布尔值只是为了传递而不是使用它。例如,

这个编译。但它只是一个黑客,有人请建议一个更好的方法。

BindingAdapter.java

@BindingAdapter("app:validator")
public static void textValidator(TextInputLayout textInputLayout, boolean bl) {

        doesSomething();
}

layout_file.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>

2 个答案:

答案 0 :(得分:1)

  

但它只是一个黑客,有人请建议一个更好的方法。

没有更好的方法,因为这不是数据绑定的目的。它的意图是字面上绑定数据,这意味着你应该在视图中设置一些数据(一个参数)而不必在你的代码中手动执行它。

您尝试执行的操作并不真正有意义,因为只有在传递要绑定到给定视图的数据时才会评估自定义绑定。因此,您最终会得到传递一些虚拟值的代码,只是为了触发验证,此时您也可以自己手动触发验证,这比通过这样的数据绑定间接进行验证要清晰得多。

如果您想在另一个视图中验证您的视图以响应某些事件,请说一个&#34;提交按钮&#34;单击或某事,然后您可以将事件处理程序绑定到控件,然后调用您的doesSomething()方法。请参阅section on event handling in the data binding documentation

希望有所帮助。

答案 1 :(得分:0)

您可以通过一个验证标准,例如一个枚举,指示它是否必须验证电子邮件,数字,最小长度的字符串等,甚至是错误消息:

@BindingAdapter({"app:validation", "app:errorMsg"})
    public static void setErrorEnable(EditText editText, StringValidationRules.StringRule stringRule, final String errorMsg)