绑定适配器有问题。代码如下:
@BindingAdapter(value = {"menu", "menuItemClick"}, requireAll = false)
public static void setMenu(View view, int menu, PopupMenu.OnMenuItemClickListener listener) {
if (menu == 0 || menu == -1) {
return;
}
view.setOnClickListener(v -> {
PopupMenu popup = new PopupMenu(v.getContext(), view);
//Inflating the Popup using xml file
popup.getMenuInflater().inflate(menu, popup.getMenu());
popup.setOnMenuItemClickListener(listener);
popup.show();
});
}
在布局层次结构中查看:
<FrameLayout
android:layout_width="@dimen/fields_edit_hint_length"
android:layout_height="52dp"
android:layout_gravity="end"
app:menu="@{item.getTypesMenuRes()}"
app:menuItemClick="@{item}"
app:visible="@{item.value.length!= 0 && !item.isFieldLocked()}"/>
方法getTypesMenuRes返回int,如在Binding Adapter
中一样 public int getTypesMenuRes() {
switch (type()) {
case PhoneNumber:
return R.menu.edit_fields_phone_types;
case Email:
return R.menu.edit_fields_email_types;
default:
return -1;
}
}
但我得到了编译时错误:
Error:(67, 29) Cannot find the setter for attribute 'app:menu' with parameter type int on android.widget.FrameLayout.
我在BindingAdapter中使用View而不是FrameLayout,但它是允许的,因为它是FrameLayout的预先安装者(之前我做过很多次),而且我绝对不会理解这个错误。你能给我一些建议吗?
更新
我换了线
app:menu="@{item.getTypesMenuRes()}"
app:menuItemClick="@{item}"
并使用app:menuItemClick获得相同的错误。试图删除requiredAll = false
,但也没有帮助
答案 0 :(得分:1)
发现了。我正在使用BindingAdapter android.support.v7.widget.PopupMenu
; ,但是Field Field正在实施android.widget.PopupMenu.OnMenuItemClickListener
;结果BindingAdapter是错误的,并且布局中的视图中的不同字段顺序。这个错误很自然