【问题标题】:Android Databinding BindingAdapter ErrorAndroid 数据绑定 BindingAdapter 错误
【发布时间】:2017-05-05 13:34:10
【问题描述】:

我正在使用以下内容:

公共类 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>

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

错误:(33, 25) 找不到属性“app:onClick”的设置器 android.widget.Button 上的参数类型 lambda。

但是,如果我从绑定适配器和布局中删除 eventName 东西,它就可以正常工作。

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

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

【问题讨论】:

  • 你有app:eventName的另一个绑定适配器吗?
  • 不。这是唯一的绑定适配器。

标签: android android-databinding


【解决方案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);
}

【讨论】:

  • 其实我不确定这是否是错误的正确原因。但我分享的是我所理解的。由于 onClick 是用户定义的属性,并且您正在通过 lambda 表达式传递一个新的 View.OnClickListener 类;视图需要将属性值设置为它的View.OnClickListener变量字段。但是由于没有这样的setter方法,它显示错误。如果您这样做了,您的实现就会起作用:&lt;variable name="listener" type="android.view.View.OnClickListener"/&gt; 并将其设置为 app:onClick="@{listener}"
  • 但是为什么当我从绑定适配器和 xml 文件中删除 app:eventName 时它会起作用。
【解决方案2】:

尝试更改您的 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);
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2017-07-22
    • 2017-02-13
    • 2017-01-28
    相关资源
    最近更新 更多