Преобразование типа Integer в Strint Android data binding

Рейтинг: 0Ответов: 1Опубликовано: 09.05.2023

Подскажите как заставить работать @BindingConversion, никак не могу найти ошибку. Пишу приложение на Android и пытаюсь использовать для этого Binding и ViewModel. Проблема следующая. Есть Фрагмент с расположенным на нем текстовым полем

            <data>
                <variable
                    name="modelDoc"
                    type="ru.viewModel.ViewModelDoc" />

            </data>
       ..............
            <TextView
                android:id="@+id/textCountAll"
                android:text="@{String.valueOf(modelDoc.countAllBarDoc)}"/>

Сама переменная countAllBarDoc представляет из себя

          MutableLiveData<Integer> countAllBarDoc;

Никак не получается сделать вывод без использования конструкции String.valueOf() Пытаюсь во фрагменте сделать функцию преобразования типов, но она, почему то, не работает

@BindingConversion
public static String convertIntegerToString(Integer countAllBarDoc) {
    return "Integer.toString(countAllBarDoc)";
}

Пробовал разные комбинации названий (convertIntToString, convertintToString и тп), но он в нее даже и не заходит.

Подскажите что я делаю не так?

Ответы

▲ 1Принят

Аннотация @BindingConversion регистрирует метод как конвертер типов.
Имя метода не имеет значения, важны только тип параметра и возвращаемый тип - они должны совпадать с типом данных и ожидаемым типом соответственно.
В теории ваш метод верный, но проблема конкретно этого примера в том, что атрибут android:text применяется вызовом метода TextView.setText(), который имеет несколько перегрузок. Одна из них setText(int resId) принимает id string-ресурса и она как раз подходит по типу к вашему значению - поэтому конвертация не применяется.
В итоге число интерпретируется как id ресурса, которого не существует.
Если вы замените тип Integer у LiveData и метода-конвертера на любой другой, например Long - всё будет работать как ожидается.