2017-07-17 9 views
1

バインディングアダプタに問題があります。ここでは、コード:レイアウト階層で{type}のパラメータタイプ{type}の属性 '{attribute}'のセッターが見つかりません

@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が

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; 
    } 
} 

バインドアダプタのように、intを返しますが、私は時間erroeをコンパイルし得る:

Error:(67, 29) Cannot find the setter for attribute 'app:menu' with parameter type int on android.widget.FrameLayout. 

私は使用していますBindingAdapter内のFrameLayoutの代わりにViewを表示しますが、これはFrameLayoutのプリプロセッサであるため(これは何度もやったことがあります)、このエラーの理由を絶対に無視しません。私に何かアドバイスできますか?

更新:

私はライン

  app:menu="@{item.getTypesMenuRes()}" 
      app:menuItemClick="@{item}" 

を切り替えるとアプリと同じエラーを取得しています:menuItemClickを。 requiredAll = falseを削除しようとしましたが、役に立たなかった

答えて

1

見つけました。私はBindingAdapterを使用していましたandroid.support.v7.widget.PopupMenu;クラスフィールドはandroid.widget.PopupMenu.OnMenuItemClickListenerを実装していました。その結果、BindingAdapterは間違っていて、レイアウト内のビューのフィールドの順序が異なっていました。そしてこのエラーは自然でした

関連する問題