【问题标题】:Android Data Binding Issue: The expression XXX cannot be invertedAndroid 数据绑定问题:无法反转表达式 XXX
【发布时间】:2023-03-26 03:59:02
【问题描述】:

我是 android 数据绑定的新手。 我想将多个SeekBars绑定到一个float集合,比如

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

由于SeekBar的进度是Int类型,我觉得还是用Converter比较好,下面是转换器代码:

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/two-way

但我仍然无法找出问题所在。谁能给我一些建议?

我的开发环境

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 后,一切正常。

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,项目可以编译成功,但是绑定不起作用。

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

参考:Databinding annotation processor kapt warning

【问题讨论】:

  • 抱歉打错了。实际上,我尝试将 floatToProgress 重写为 floatToString 一次,因为大多数示例都转换为字符串。
  • @UmangBurman 感谢您的建议。不幸的是,我已经尝试了 '@JvmStatic' 并且不起作用。
  • not @JvmStatic fun progressToFloat 在你的两个函数中尝试 public static fun progressToFloat
  • 哦,是的,我忘了.. 谢谢@tynn
  • 大家好,感谢您的帮助,我刚刚更新了解决方案...我真的问了一个愚蠢的问题...

标签: android data-binding kotlin android-databinding two-way-binding


【解决方案1】:

解决方案

好的,我发现了问题:我的项目没有使用 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,项目可以编译成功,但是绑定不起作用。

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

参考:Databinding annotation processor kapt warning

【讨论】:

  • 感谢 +1 :)
【解决方案2】:

在我的情况下,问题是我试图制作一个自定义 TwoWay DataBinding Adapter

但我在 ViewModel 类中的字段是 LiveData 而不是 MutableLiveData

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 2017-03-24
    • 2019-05-17
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多