Android 数据绑定问题:无法反转表达式 XXX
Android Data Binding Issue: The expression XXX cannot be inverted
我是 android 数据绑定的新手。
我想绑定多个SeekBars到一个float的集合,比如
SeekBar1.progress <---> modelArray[0]
SeekBar2.progress <---> modelArray[1]
...
由于SeekBar的progress是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
更新:
我也尝试按如下方式编写 Converter :
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,项目可以编译成功,但是绑定不起作用。
感谢所有给我建议的人。我想我只是问了一个愚蠢的问题。
参考:
解决方案
好的,我发现了问题:我的项目没有使用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,项目可以编译成功,但是绑定不起作用。
感谢所有给我建议的人。我想我只是问了一个愚蠢的问题。
参考:
在我的例子中,问题是我试图制作自定义 TwoWay DataBinding Adapter
但我在 ViewModel
class 中的字段是 LiveData
而不是 MutableLiveData
我是 android 数据绑定的新手。 我想绑定多个SeekBars到一个float的集合,比如
SeekBar1.progress <---> modelArray[0]
SeekBar2.progress <---> modelArray[1]
...
由于SeekBar的progress是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
更新: 我也尝试按如下方式编写 Converter :
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,项目可以编译成功,但是绑定不起作用。
感谢所有给我建议的人。我想我只是问了一个愚蠢的问题。
参考:
解决方案
好的,我发现了问题:我的项目没有使用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,项目可以编译成功,但是绑定不起作用。
感谢所有给我建议的人。我想我只是问了一个愚蠢的问题。
参考:
在我的例子中,问题是我试图制作自定义 TwoWay DataBinding Adapter
但我在 ViewModel
class 中的字段是 LiveData
而不是 MutableLiveData