Условно установите TextView TextStyle на курсив в layout XML

#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.