当前位置: 首页 > 知识库问答 >
问题:

Android数据绑定问题:表达式XXX不能倒置

曹铭晨
2023-03-14

我是android数据绑定的新手。我想将多个SeekBars绑定到浮点数集合,例如

SeekBar1.progress <---> modelArray[0]
SeekBar2.progress <---> modelArray[1]
...

由于SeekBar的进展是Int类型,我认为使用转换器会更好,下面是转换器代码:

import android.databinding.InverseMethod
import android.util.Log
import kotlin.math.roundToInt
class Converter {
    @InverseMethod("progressToFloat")
    fun floatToProgress(value: Float): Int {
        val result = (value * 100.0f).roundToInt()
        Log.i("MODEL", "convert $value to $result(Int)")
        return result
    }

    fun progressToFloat(value: Int): Float {
        return value.toFloat()/100.0f
    }
}

模型结构看起来像这样:

class Model {
 val params by lazy {
        ObservableArrayMap<Int, Float>()
 }
 //....
}

我的xml如下:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data class="MyBinding">
        <variable name="Converter" type="com.mypackage.model.Converter"></variable>
        <variable
            name="Converter"
            type="com.mypackage.model.Converter"></variable>

        <variable
            name="model"
            type="com.mypackage.model.Model"></variable>
    </data>
...
        <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="20dp"
            android:progress="@={Converter.floatToProgress(model.params[0])}"/>

问题是,每次我构建它时,它都会显示:

Found data binding errors.
****/ data binding error ****
msg:The expression converter.floatToProgress(modelParams0) cannot be inverted: 
There is no inverse for method floatToProgress, you must add an @InverseMethod 
annotation to the method to indicate which method should be used when using 
it in two-way binding expressions

我已经参考了很多网站,包括以下内容:

https://medium.com/androiddevelopers/android-data-binding-inverse-functions-95aab4b11873

https://developer . Android . com/topic/libraries/data-binding/双向

但我仍然无法找出问题所在。任何人都可以给我一些建议吗?

我的开发环境

macOS High Sierra, 
Android Studio 3.2.1, with compileSdkVersion 28 and gradle 3.2.1

更新:我也尝试编写转换器如下:

object Converter { // change to object
    @InverseMethod("progressToFloat")
    @JvmStatic fun floatToProgress(value: Float): Int { // Add static
        val result = (value * 100.0f).roundToInt()
        Log.i("MODEL", "convert $value to $result(Int)")
        return result
    }

    @JvmStatic fun progressToFloat(value: Int): Float { // Add static
        return value.toFloat()/100.0f
    }
}

它仍然不起作用。

解决方案好的,我发现了问题:我的项目不使用Kapt。将其添加到build.gradle后,一切正常。

应用插件:“kotlin kapt”

此外,我更新转换器主体如下:

object Converter {
    @InverseMethod("progressToFloat")
    @JvmStatic fun floatToProgress(value: Float): Int {
        val result = (value * 100.0f).roundToInt()
        Log.i("MODEL", "convert $value to $result(Int)")
        return result
    }

    @JvmStatic fun progressToFloat(value: Int): Float {
        val result =  value.toFloat()/100.0f
        Log.i("MODEL", "convert $value to $result(Float)")
        return result
    }
}

如果@JVMStatic被移除,项目可以成功编译,但是绑定不起作用。

谢谢每个给我建议的人。我想我只是问了一个愚蠢的问题。

请参阅:数据绑定注释处理器kapt警告

共有2个答案

郏志学
2023-03-14

在我的情况下,问题是我试图制作一个自定义的Twway数据绑定适配器

但是我在<code>ViewModel

夏侯嘉荣
2023-03-14

好的,我发现了问题:我的项目不使用Kapt。将其添加到build.gradle后,一切正常。

apply plugin: 'kotlin-kapt'

此外,我更新转换器主体如下:

object Converter {
    @InverseMethod("progressToFloat")
    @JvmStatic fun floatToProgress(value: Float): Int {
        val result = (value * 100.0f).roundToInt()
        Log.i("MODEL", "convert $value to $result(Int)")
        return result
    }

    @JvmStatic fun progressToFloat(value: Int): Float {
        val result =  value.toFloat()/100.0f
        Log.i("MODEL", "convert $value to $result(Float)")
        return result
    }
}

如果@JVMStatic被移除,项目可以成功编译,但是绑定不起作用。

谢谢每个给我建议的人。我想我只是问了一个愚蠢的问题。

请参阅:数据绑定注释处理器kapt警告

 类似资料:
  • 我正在试用新的数据绑定库。我有一个奇怪的问题,属性的绑定没有编译。 这是xml文件的简化版本: 编译时收到以下消息: java.lang.RuntimeException:发现数据绑定错误. ****/ 数据绑定错误****msg:标识符必须具有XML文件中用户定义的类型。视图缺少它 当我删除声明时,一切都会编译(并正常工作!)。 我不知道我错过了什么

  • 我尝试将属性和一些数据绑定到模板,但下面的代码不起作用。我需要的是呈现n个模板的数量取决于printedForms对象的数量,并在每个模板中实现来自适当对象的数据。请告诉我我的代码有什么问题。 注意:控制台中有如下警告:[Vue warn]:计算表达式“printedForm.docNumber”时出错:TypeError:无法读取未定义(在组件中找到)的属性“docNumber”) 我的VueJ

  • 当我将android Studio 3.2.0更新为3.2.1时。我已经使用数据绑定,当运行项目时会显示这样的错误,如果我错了,请建议我。 要求:项目:应用 项目格拉德尔 应用程序。格拉德尔 如果我错了,请建议我。

  • 我试图在回收器视图中使用数据绑定,我有问题。在data-variable上,我不能选择真正的类型(相反,我可以选择type作为默认包。然后我不能访问适配器类上的变量。我在适配器上得到的错误是:binding.curmovie=movie。我得到的错误是:不能访问类movieItem检查模块类路径是否缺少或冲突的依赖关系绑定 movieitem.kt文件 list_item.xml文件 moviea

  • 我正在使用添加启用数据绑定 数据绑定{启用=真} 和 卡普特公司。Android数据绑定:编译器:3.1.4' 在应用程序级别<代码>生成。gradle文件。 应用插件:“kotlin kapt” 是添加在此之上。项目基于kotlin。 这是我的模型: 主要活动: 这是我的布局: 我会得到这个错误: 我怎样才能解决这个问题?有什么问题吗?

  • 我的应用程序检查是否有一个带有日期的文件。 如果有日期,它将计算今天和该(未来)日期之间的差值,并初始化计时器,以X天Y小时Z分S秒的方式倒计时到该日期。 如果没有文件,则用户可以通过按钮选择日期。程序将在文件中存储日期并设置倒计时。 有一个删除按钮可以删除日期并选择其他日期。此删除按钮应取消计时器,使其停止计数。 当我取消计时器时,计时器不会停止。我的计时器滴答作响,但相差2秒,而不是1秒。显示