2017-05-05 24 views
0

私は、次の使用しています。ここAndroidのデータバインディングBindingAdapterエラー

パブリッククラスBindingAdapter {

@android.databinding.BindingAdapter({"app:eventName", "app:onClick"}) 
public static void setColorChangeListener(final View view, 
              final String eventName, 
              View.OnClickListener newListener) { 
    CompositeClickListener c = new CompositeClickListener(); 
    c.addOnClickListener(newListener); 
    View.OnClickListener a = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Toast.makeText(view.getContext(), eventName, Toast.LENGTH_SHORT).show(); 
     } 
    }; 
    c.addOnClickListener(a); 
    view.setOnClickListener(c); 
} 
} 

は、プロジェクトをビルドしながら、私はこのエラーを取得しています私のレイアウトファイル

<?xml version="1.0" encoding="utf-8"?> 
<layout 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 
    <import type="android.widget.Toast" /> 

    <variable 
     name="namewa" 
     type="String" /> 

     <variable 
      name="namewa2" 
      type="String" /> 
     <!--<variable 
      name="banner" 
      type="games.kapow.android.ui.view_models.BannerViewModel" />--> 
    </data> 
<android.support.constraint.ConstraintLayout 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.arjitagarwal.helloworld.MainActivity"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:eventName="@{namewa}" 
     app:onClick= "@{(v) -> Toast.makeText(v.getContext(), namewa, Toast.LENGTH_LONG).show()}" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

</android.support.constraint.ConstraintLayout> 

</layout> 

です:

Error:(33, 25) Cannot find the setter for attribute 'app:onClick' with parameter type lambda on android.widget.Button.

しかし、もし私がeventNameのものをバインディングアダプタとレイアウトから取り除くと、うまく動作します。

https://developer.android.com/reference/android/databinding/BindingAdapter.html

上記リンクは、同じ方法でこれを行います。私が間違っていることは何ですか?

+0

「app:eventName」に別のバインディングアダプタがありますか? –

+0

いいえこれは唯一のバインディングアダプタです。 – Embydextrous

答えて

1

注釈のわずかな変化が私のために働いています。デフォルトではrequireAllはtrueです。

@BindingAdapter(value = {"eventName", "onClick"}, requireAll = false) 
public static void setColorChangeListener(final View view, 
              final String eventName, 
              View.OnClickListener newListener) { 
    CompositeClickListener c = new CompositeClickListener(); 
    c.addOnClickListener(newListener); 
    View.OnClickListener a = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Toast.makeText(view.getContext(), eventName, Toast.LENGTH_SHORT).show(); 
     } 
    }; 
    c.addOnClickListener(a); 
    view.setOnClickListener(c); 
} 
+0

それは魔法のように機能します。なぜそれが働くのか少し説明できますか? – Embydextrous

+0

実際に、それがエラーの正しい理由であるかどうかはわかりません。しかし私は私が理解したことを分かち合っています。 onClickはユーザー定義の属性で、ラムダ式を使用して新しい 'View.OnClickListener'クラスを渡しています。ビューはその属性値を 'View.OnClickListener'変数フィールドに設定する必要があります。しかし、そのようなセッターメソッドがないので、エラーを表示しています。 'アプリのようにそれを ' <変数 名= "リスナー" タイプ= "android.view.View.OnClickListener" /> ' と設定:あなたはこれを行っている場合は、あなたの実装が働いていたのonClick = "@ {listener}" ' – CodeCameo

+0

しかし、なぜそれはアダプタとXMLファイルのバインディングからapp:eventNameを削除すると機能しますか? – Embydextrous

1

は、あなたのバインディングメソッドの署名を変更しよう:

BindingAdapter({"eventName", "onClick"}) 
public static void setColorChangeListener(final View view, 
              final String eventName, 
              View.OnClickListener newListener) { 
    CompositeClickListener c = new CompositeClickListener(); 
    c.addOnClickListener(newListener); 
    View.OnClickListener a = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Toast.makeText(view.getContext(), eventName, Toast.LENGTH_SHORT).show(); 
     } 
    }; 
    c.addOnClickListener(a); 
    view.setOnClickListener(c); 
} 
} 
+0

私はこれを試しましたが、同じエラーが発生しています。 – Embydextrous

関連する問題