Почему я могу привязывать данные с помощью Android:background=»@{!aHomeViewModel.isHaveRecord? #FFFFF: #F3F3F8}»?

#android #android-livedata

#Android #android-livedata

Вопрос:

Я использую LiveData в XML-файле макета в Android Studio, Code A и Code работают хорошо.

Но код C не может быть скомпилирован, как я могу это исправить?

Информация об ошибке

ожидалось, получил ‘#’

Код A

 <androidx.recyclerview.widget.RecyclerView
      ...                
      android:visibility="@{aHomeViewModel.isHaveRecord? View.VISIBLE: View.GONE}"
   />
  

Код B

   <androidx.recyclerview.widget.RecyclerView
      ...           
      android:background="#F3F3F8"     
   />
  

Код C

   <androidx.recyclerview.widget.RecyclerView
      ...           
      android:background="@{!aHomeViewModel.isHaveRecord? #FFFFFF: #F3F3F8}"     
   />
  

Комментарии:

1. #FFFFF — это не цвет. Есть только 5 F

2. Спасибо! Я все еще получаю ошибку <expr> expected, got '#' после того, как я ее исправил.

Ответ №1:

colors.xml

 <resources>
    <color name="colorOne">#f3f3f8</color>
    <color name="colorTwo">#ffffff</color>
</resources>
  

Затем в вашем XML-макете

 android:background="@{!aHomeViewModel.isHaveRecord ? @color/colorOne : @color/colorTwo }">
  

Ответ №2:

Привязка данных не может работать с жестко заданными шестнадцатеричными значениями.

Ваш лучший вариант — использовать:

 android:background="@{aHomeViewModel.isHaveRecord ? @color/record : @color/noRecord}"
  

В качестве альтернативы вы можете попробовать использовать целочисленное значение цвета. Это может принимать целочисленное значение. Если нет, строка выше — ваш единственный путь.

 // (FFFFFF)16 = (16777215)10
// (F3F3F8)16 = (15987704)10
android:background="@{aHomeViewModel.isHaveRecord ? 16777215 : 15987704}"
  

(https://www.binaryhexconverter.com/hex-to-decimal-converter )

Ответ №3:

Я думаю, что нет логического not выражения для ! привязки данных / at

Может быть, вы можете заменить возвращаемое значение фоном вместо этого?

    <androidx.recyclerview.widget.RecyclerView
      ...           
      android:background="@{aHomeViewModel.isHaveRecord ? #F3F3F8: #FFFFFF}"     
   />