Android Data Binding 掉坑日志

Android Data Binding 掉坑日志

错误:Cannot find the setter for attribute *** with parameter type lambda on ***.

Binding Adapter:

@BindingAdapter({"app:onLeftActionClick", "app:onRightActionClick"})
public static void setActionClickListener(ActionableTitleBar view, 
                                          OnClickListener left,
                                          OnClickListener right) {
    view.setLeftActionClickListener(left);
    view.setRightActionClickListener(right);
}

XML:


编译的时候出现了该错误。头皮都快挠破了才发现必需两个Listener同时设置才不会报错,也就是还要在XML里加上app:onLeftActionClick="..."才行。这不科学啊,难道还得写两个单独设置的Binding Adapter不成?这时候才想起来看下BindingAdapter 的源码试试(这也太迟了吧,早想啥去了。。。),发现源码是这样的:

@Target({ElementType.METHOD})
public @interface BindingAdapter {
    String[] value();
    boolean requireAll() default true;
}

requireAll default true 。。。
我了个去。。。早知道先看看源码了。。。
好了,加上在BindingAdapter的参数上requireAll = false就可以了:

@BindingAdapter(value = {"app:onLeftActionClick", "app:onRightActionClick"}, requireAll = false)

警告: Application namespace for attribute *** will be ignored.

如果上一个问题解决了以后,可能还会出现这一警告: Application namespace for attribute app:onLeftActionClick will be ignored.
虽然不会出现错误,但是对于像我这样有重度强迫证的人来说,就是各种不爽,这是不能忍的!Google了一下,终于找到了解决办法:http://www.devsplanet.com/question/35313466 。其实非常简单,就是把命名空间去掉就行了:

@BindingAdapter(value = {"onLeftActionClick", "onRightActionClick"}, requireAll = false)

然后你就可以在XML里自由地使用你想要的任何命名空间了,例如:app:bind:或者其他的,当然android:命名空间是不能用的。

你可能感兴趣的:(Android Data Binding 掉坑日志)