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:
<cn.yiiguxing.sample.widget.ActionableTitleBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:onLeftActionClick='@{(v)->presenter.onClick(v)}'
app:titleText="Title" />
编译的时候出现了该错误。头皮都快挠破了才发现必需两个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:
命名空间是不能用的。