#android #kotlin #android-databinding
#Android #kotlin #android-привязка к данным
Вопрос:
Я хочу условно установить атрибут TextStyle для TextView в моем файле макета. Установка «обычный» или «курсивный» напрямую работает нормально, но как бы я применил один из этих двух на основе некоторого логического значения в моей привязке данных?
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="isComplete"
type="boolean" />
</data>
...
<TextView>
android:text="Some Text"
android:textStyle="@{isComplete ? @string/textStyle_normal : @string/textStyle_italic}"
</TextView>
Когда я пытаюсь выполнить вышеуказанное, ошибка неясна, но мой класс XXXBindingImpl, похоже, не генерируется. Я могу программно обновить стиль текста в kotlin, но мне было любопытно, есть ли способ заставить это работать в самом представлении.
Ответ №1:
Для достижения этой цели вы можете использовать адаптер привязки:
BindingAdapter.kt
@JvmStatic
@BindingAdapter("setTextCustomStyle")
fun TextView.setTextCustomStyle(isNormal:Boolean){
if (isNormal) this.setTypeface(this.typeface,Typeface.NORMAL) else this.setTypeface(this.typeface,Typeface.ITALIC)
}
xyz.xml:
<TextView
android:id="@ id/tvItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{item.title}"
setTextCustomStyle="@{isComplete}"
tools:text="some text"/>
Комментарии:
1. Все еще не уверен, почему троичный файл на основе строк, который я пробовал, не работает, но, несмотря на это, это работает.
Ответ №2:
Похоже, вы установили «тип» переменной
<data>
<variable
name="isComplete"
type="com.example.YourClass" />
</data>
В поле «тип» вы должны указать имя класса с именем пакета, например «com.example.YourClass», как в примере выше.
Комментарии:
1. Тип в этом случае уже установлен на boolean. Проблема заключается в настройке TextStyle.