Проблема привязки данных Android: выражение XXX не может быть инвертировано - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в привязке данных Android.Я хочу связать несколько SeekBars с коллекцией с плавающей точкой, такой как

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

Обновление: Я также пытаюсь написать 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 процессора аннотаций привязки данных

Ответы [ 2 ]

0 голосов
/ 20 июля 2019

В моем случае проблема заключалась в том, что я пытался создать собственный адаптер двусторонней привязки данных

, но мое поле в классе модели представления было живыми данными вместо изменяемых живых данных

0 голосов
/ 24 октября 2018

Решение

Хорошо, я нашел проблему: Мой проект не использует 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 процессора аннотаций привязки данных

...