Привязка данных в Android не может найти сеттер с java.langString - PullRequest
0 голосов
/ 04 октября 2019

Я делаю привязку данных с пользовательским компонентом и сталкиваюсь с трудностями, пытаясь связать строку со значением в моем xml.

Вот компонент xml в xml. Проблема заключалась в замене строки progressText динамических переменных. Я получаю

Не могу найти сеттер длякоторый принимает тип параметра 'java.lang.String'

ошибка при попытке скомпилировать xml.

            <com.mycompany.CircleProgressBar
                xmlns:cpb="http://schemas.android.com/apk/res-auto"
                android:id="@+id/progressWheel"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_centerInParent="true"
                android:layout_margin="10dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                cpb:progress="@{viewmodel.progress}"
                cpb:progressColor="@color/colorPrimary"
                cpb:backgroundColor="@color/gray"
                cpb:backgroundWidth="10"
                cpb:textSize="10sp"
                cpb:differenceInTextSizeInLines="10"
                cpb:roundedCorners="true"
                cpb:progressText="@{@string/work_package_percent_complete(viewmodel.progress)}"
                cpb:spaceBetweenLines="5"
                cpb:maxValue="100"
                cpb:progressTextColor="@color/colorPrimary" />

Вот как я объявляю переменную, используемую в моем CircleProgressBar:

@BindingAdapter("progressText")
fun setTextView(view: CircleProgressBar, value: String) {
    if (this::ta.isInitialized) {
        this.text = ta.getString(R.styleable.CircleProgressBar_progressText) as String
    } else {
        this.text = value
    }
    view.invalidate()
}

Когда я пытаюсь выполнить оператор импорта для String в верхней части моего XML-файла, яполучение дубликата String уже объявлено. Если я просто вставляю прямой текст без замены строки, все работает нормально.

1 Ответ

0 голосов
/ 05 октября 2019

Кажется, BindingAdapter часто злоупотребляют, потому что это слишком много для простых привязок. Идея состоит в том, чтобы генерировать их, а не программировать их - и для этого достаточно String getter / setter с ожидаемым именем. Чтобы раскрыть ожидаемые методы, эти методы просто необходимо вызвать:

  • setProgressText(value: String)
  • getProgressText()

Когда CircleProgressBar - это поле, его не нужно передавать в метод, сохраняя ожидаемую сигнатуру метода, на отсутствие которой он явно жалуется. Это даже не должно быть поле в модели представления, потому что модель не должна зависеть от представлений.

...