Преобразование типа Integer в Strint Android data binding
Подскажите как заставить работать @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 - всё будет работать как ожидается.