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

bsxbgnwa  于 2024-01-04  发布在  Android
关注(0)|答案(5)|浏览(239)

我试图在数据绑定布局中声明一个变量,它的类型是整数数组,但我在构建项目时出错
找不到<android.widget.LinearLayout app:availableGradesIndexes>接受参数类型“int[]”的setter
如果绑定适配器提供了setter,请检查适配器的注解是否正确,参数类型是否匹配。
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" />

我还尝试了什么

我试图像fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: IntArray)那样将绑定适配器方法的类型声明到IntArray
我也尝试了List<Int>,如fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: List<Int>)和变量类型List&lt;Int&gt;
我还尝试将绑定变量类型设置为IntegerInteger[]以及List&lt;Integer&gt;

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

koaltpgm

koaltpgm1#

我也遇到了类似的问题,如标题所述。我试图通过<include>标签布局的数据绑定来更改可见性,如下所示:

<include
            android:id="@+id/viewNoData"
            layout="@layout/layout_no_data"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/quickActionRv"
            android:visibility="@{case== Case.NoData? View.VISIBLE : View.GONE}
            />

字符串
解决方案是,我必须将子布局layout_no_data Package 为

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

    </data>
Your content layout
</layout>


希望它能帮助某人。

pnwntuvh

pnwntuvh2#

这是因为Kotlin中的Array是Java中的Array []。
尝试在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>

flvlnr44

flvlnr443#

你可以使用List来代替int[],但这需要将List类导入布局,以便能够将其用作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")
        }

    }
}

e3bfsja2

e3bfsja24#

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

<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" />

字符串

xnifntxz

xnifntxz5#

在Kotlin案例中:
1.简单地把你的函数放在同伴对象中,就像这样。

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

字符串
1.确保属性应相同

app:availableGradesIndexes="@{availableGradesIndexes}"

相关问题