无法找到属性' {attribute}'的设置者在{View}上使用参数类型{type}

时间:2017-07-17 09:04:51

标签: android android-databinding

绑定适配器有问题。代码如下:

@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 &amp;&amp; !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,但也没有帮助

1 个答案:

答案 0 :(得分:1)

发现了。我正在使用BindingAdapter android.support.v7.widget.PopupMenu; ,但是Field Field正在实施android.widget.PopupMenu.OnMenuItemClickListener;结果BindingAdapter是错误的,并且布局中的视图中的不同字段顺序。这个错误很自然