0

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

找不到接受参数类型“int[]”的 <android.widget.LinearLayout app:availableGradesIndexes> 的设置器

如果绑定适配器提供了设置器,请检查适配器是否正确注释以及参数类型是否匹配。

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>likefun LinearLayout.bindGradeWithMarks(availableGradesIndexes: List<Int>)和variable类型List&lt;Int&gt;

还尝试将绑定变量类型设置为Integerand Integer[]and alsoList&lt;Integer&gt;

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

4

3 回答 3

0

int[]您可以使用 a代替List,但这需要将List类导入布局中,以便能够将其用作type变量availableGradesIndexes的 a:

<data>

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

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

然后,您可以使用 BindingAdapter 将其应用于List<Int>

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

    }
}
于 2021-10-03T18:49:20.500 回答
0

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

<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" />
于 2021-10-06T18:23:06.187 回答
0

这是因为 Kotlin 中的 Array<Int> 在 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>
于 2021-10-03T17:06:14.503 回答