Android 数据绑定找不到接受参数类型 * 的 setter

Android Databinding Cannot find a setter for * that accepts parameter type *

我试图在数据绑定布局中声明一个变量,它的类型是整数数组,但在构建项目时出现错误

Cannot find a setter for <android.widget.LinearLayout app:availableGradesIndexes> that accepts parameter type 'int[]'

If a binding adapter provides the setter, check that the adapter is annotated correctly and that the parameter type matches.

xml中的变量声明

<variable
    name="availableGradesIndexes"
    type="int[]" />

<variable
    name="subject"
    type="Subject" />

绑定适配器

@BindingAdapter("availableGradesIndexes", "subject")
fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: Array<Int>) {
    //....
}

用法

<LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:subjct="@{subject}"
        app:availableGradesIndexes="@{availableGradesIndexes}"
        tools:layout_height="@dimen/_40sdp" />

我还尝试了什么

试图将绑定适配器方法的类型声明为 IntArray,如 fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: IntArray)

也尝试了 List<Int>fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: List<Int>) 和变量类型 List&lt;Int&gt;

还尝试将绑定变量类型设置为 IntegerInteger[] 以及 List&lt;Integer&gt;

所以问题是如何使用绑定适配器绑定整数列表或数组?!

因为Kotlin中的Array是Java中的Integer[]。
尝试在 Java 中使用 IntArray 它将是 int[].

我用 IntArray 试过你的例子,它有效。

@BindingAdapter("availableGradesIndexes")
fun LinearLayout.bindGradeWithMarks( availableGradesIndexes: IntArray ) {
}

你能展示一下你的布局吗XML?

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="availableGradesIndexes"
            type="int[]" />
    </data>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:availableGradesIndexes="@{availableGradesIndexes}"
        tools:layout_height="match_parent" />

</layout>

您可以使用 List 而不是 int[],但这需要将 List class 导入到布局中才能将其用作availableGradesIndexes 变量的 type

<data>

    <import type="java.util.List" />

    <variable
        name="availableGradesIndexes"
        type="List&lt;Integer&gt;" />
</data>

然后您可以使用 List<Int>:

将其应用于 BindingAdapter
@BindingAdapter("availableGradesIndexes")
fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: List<Int>) {
    //....
    Log.d("LOG_TAG", "bindGradeWithMarks: $availableGradesIndexes") // For testing
}

如果要使用int[]数组;不需要进口:

<data>

    <variable
        name="availableGradesIndexes"
        type="int[]" />

</data>

和适配器:

@BindingAdapter("availableGradesIndexes")
@JvmStatic
fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: IntArray) {
    //....
    Log.d("LOG_TAG", "bindGradeWithMarks: ${availableGradesIndexes.toList()}")
}

更新:

Cannot find a setter for <android.widget.LinearLayout app:availableGradesIndexes> that accepts parameter type 'java.util.List<java.lang.Integer>'

这意味着BidningAdapter方法在布局中不被识别;所以只需确保将它添加到伴随对象中,并用 @JvmStatic:

注释
class BindingAdapters {

    companion object {
        @BindingAdapter("availableGradesIndexes")
        @JvmStatic
        fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: List<Int>) {
            //....
            Log.d("LOG_TAG", "bindGradeWithMarks: $availableGradesIndexes")
        }

    }
}

问题出在另一个属性名称上,我不知道为什么错误信息没有提到它!!

<LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:subjct="@{subject}" //the attribute name was messing a letter (subject)
        app:availableGradesIndexes="@{availableGradesIndexes}"
        tools:layout_height="@dimen/_40sdp" />

在 Kotlin 案例中:

  1. 像这样简单地将你的函数放在伴随对象中。

    companion object {
    @BindingAdapter(" app:availableGradesIndexes", "subject")
     @JvmStatic fun LinearLayout.bindGradeWithMarks(
       availableGradesIndexes: Array<Int>) {
      //....
    }
    }
    
  2. 确保属性应该相同

    app:availableGradesIndexes="@{availableGradesIndexes}"