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

问题描述 投票:0回答:5
我试图在数据绑定布局中声明一个变量,它的类型是整数数组,但在构建项目时出现错误

找不到接受参数类型“int[]”的

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

我还尝试过什么

尝试将绑定适配器方法的类型声明为

IntArray

,如
fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: IntArray)

还尝试了

List<Int>

之类的
fun LinearLayout.bindGradeWithMarks(availableGradesIndexes: List<Int>)
和变量类型
List&lt;Int&gt;

还尝试将绑定变量类型设置为

Integer

Integer[]
 以及 
List&lt;Integer&gt;

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

android kotlin data-binding android-databinding android-binding-adapter
5个回答
0
投票
因为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>
    

0
投票
您可以使用

int[]

 代替 
List
,但这需要将 
List
 类导入到布局中,以便能够将其用作 
type
 变量的 
availableGradesIndexes

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

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

0
投票
以 Kotlin 为例:

  1. 只需将您的函数放入伴生对象中即可。

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

    app:availableGradesIndexes="@{availableGradesIndexes}"
    
    

0
投票
我也遇到了标题中提到的类似问题。我试图通过数据绑定来更改

<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

<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>
希望它能帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.