2017-05-05 149 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是用戶定義的屬性,並且您正在通過lambda表達式傳遞一個新的'View.OnClickListener'類;該視圖需要將屬性值設置爲它的'View.OnClickListener'變量字段。但是由於沒有這樣的setter方法,它顯示錯誤。 '<變量 名= 「監聽器」 TYPE = 「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