2017-05-05 152 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