Android数据绑定BindingAdapter错误

时间:2017-05-05 13:34:10

标签: android android-databinding

我正在使用以下内容:

public class BindingAdapter {

f1= lambda x: 2*x+2
f2= lambda x: x**2

g = lambda a: f1(a) + f2(a)
print(g(2))  # prints -> 10

这是我的布局文件

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

我在构建项目时遇到此错误:

  

错误:(33,25)无法找到属性' app的setter:onClick'同   android.widget.Button上的参数类型lambda。

但是,如果我从绑定适配器和布局中删除<?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> 的东西,它就可以正常工作。

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

以上链接以相同方式执行此操作。我做错了什么?

2 个答案:

答案 0 :(得分:1)

尝试更改Binding方法的签名:

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

答案 1 :(得分:1)

注释的微小变化对我有用。默认情况下,requireAll为真。

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