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<Int>
还尝试将绑定变量类型设置为 Integer
和 Integer[]
以及 List<Integer>
所以问题是如何使用绑定适配器绑定整数列表或数组?!
因为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<Integer>" />
</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 案例中:
像这样简单地将你的函数放在伴随对象中。
companion object {
@BindingAdapter(" app:availableGradesIndexes", "subject")
@JvmStatic fun LinearLayout.bindGradeWithMarks(
availableGradesIndexes: Array<Int>) {
//....
}
}
确保属性应该相同
app:availableGradesIndexes="@{availableGradesIndexes}"
我试图在数据绑定布局中声明一个变量,它的类型是整数数组,但在构建项目时出现错误
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<Int>
还尝试将绑定变量类型设置为 Integer
和 Integer[]
以及 List<Integer>
所以问题是如何使用绑定适配器绑定整数列表或数组?!
因为Kotlin中的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>
您可以使用 List
而不是 int[]
,但这需要将 List
class 导入到布局中才能将其用作availableGradesIndexes
变量的 type
:
<data>
<import type="java.util.List" />
<variable
name="availableGradesIndexes"
type="List<Integer>" />
</data>
然后您可以使用 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")
}
}
}
问题出在另一个属性名称上,我不知道为什么错误信息没有提到它!!
<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 案例中:
像这样简单地将你的函数放在伴随对象中。
companion object { @BindingAdapter(" app:availableGradesIndexes", "subject") @JvmStatic fun LinearLayout.bindGradeWithMarks( availableGradesIndexes: Array<Int>) { //.... } }
确保属性应该相同
app:availableGradesIndexes="@{availableGradesIndexes}"