2017-05-05 1 views
0

내가 사용 다음 오전 :안드로이드 데이터 바인딩 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' 변수 필드로 설정해야합니다. 그러나 그러한 setter 메소드가 없기 때문에 오류가 표시됩니다. '응용 프로그램처럼 '<변수 이름 = "청취자" 유형 = "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

관련 문제