Использование BindingAdapter со строковым массивом в Kotlin - PullRequest
0 голосов
/ 03 марта 2019

У меня есть следующий BindingAdapter:

@BindingAdapter("entries")
fun setEntries(view: Spinner, entries: Array<String>) {
    // Do something
}

И в моем XML-файле:

<Spinner
    android:id="@+id/spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:entries="@{@stringArray/my_string_array}"/>

Но при сборке я получаю ошибку:

e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'app:entries' with parameter type java.lang.String[] on android.widget.Spinner.

Я следовал совету в этом вопросе, но каков будет эквивалент Котлина для String[] в этом случае?

Или, альтернативно, я могу вместо него передать фактический resource idмассива строк в адаптер привязки?

Спасибо!

1 Ответ

0 голосов
/ 04 марта 2019

Что ж, ошибка не будет воспроизведена с предоставленным кодом, потому что он был во втором параметре, который я наивно пропустил, думая, что он не связан с проблемой.

Фактический код был:

@BindingAdapter("entries", "hint", requireAll = false)
fun setHintAdapter(view: Spinner, entries: Array<String>, @StringRes hintRes: Int?) {

    val hint = hintRes?.run {
        try {
            MainAct.i.getString(this)
        } catch (e: Resources.NotFoundException) {
            null
        }
    } ?: ""

    val layout = android.R.layout.simple_spinner_item

    view.adapter = HintAdapter(hint, view.context, layout, entries)
}

И XML:

<Spinner
    android:id="@+id/spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:entries="@{@stringArray/my_string_array}"
    app:hint="@{@string/some_string}"/>

Ошибка совершенно не связана с app:entries, она в app:hint.Я предоставляю String и ожидаю Int (ну, StringRes).

Меняя его на:

@BindingAdapter("entries", "hint", requireAll = false)
fun setHintAdapter(view: Spinner, entries: Array<String>, hint: String) {

    val layout = android.R.layout.simple_spinner_item

    view.adapter = HintAdapter(hint, view.context, layout, entries)
}

Исправляет.

...