Использование привязки данных для настройки видимости просмотра


97

Попытка установить видимость с Viewпомощью пользовательских переменных, но возникает ошибка: Identifiers must have user defined types from the XML file. visible is missing it. Можно ли настроить видимость просмотра с помощью привязки данных? Спасибо.

<data>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? visible : gone}"/>

Ответы:


218

Как указано в Руководстве разработчика Android , делать это нужно следующим образом:

<data>
    <import type="android.view.View"/>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>

5
а как выставить значение "продажа"?
Робин Гуд 01

То есть вы имеете в виду, как присвоить значение «продажа» строковой переменной?
Дэвид Артманн

в яблочко! У меня проблема. Пожалуйста, поделитесь, я сравню, а затем дам вам знать.
RobinHood

39
Черт побери! Как я пропустил Глупый импорт . Готово, спасибо.
Робин Гуд

Привет! любая идея, почему сбой положения при прокрутке? Адаптер
Робин Гуд 01

56

В вашем макете:

<data>
    <variable
        name="viewModel"
        type="...."/>
</data>


<View
 android:layout_width="10dp"
 android:layout_height="10dp"
 android:visibility="@{viewModel.saleVisibility, default=gone}"/>

В вашем Java-коде ViewModel:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}

3
Вы спасли меня от небольшой головной боли
Коэн Ван Лооверен

2
Чтобы это работало, ваша модель данных должна быть наблюдаемой.
yshahak

это сработало для меня без включения @Bindable. Когда я включил это, я получал разные ошибки привязки, включая предложение о продлении BaseObservable. Хороший указатель здесь
Джин Бо

2
Должен быть принятый ответ! У меня это сработало отлично!
Crisic

Есть предложения для LiveData<Boolean>?
Сурав Багчи

41

Проблема заключается в том, что visibilityнаходитесь в Integerна Viewклассе, это означает , что есть два пути , чтобы сделать эту работу:

  1. Используйте View.VISIBLEи View.GONEконстанты. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Определите настраиваемый сеттер, для visibilityкоторого требуется файл Boolean. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

Возможная реализация:

@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
    view.setVisibility(value ? View.VISIBLE : View.GONE);
}

Что заставит <FrameLayout android:visibility="@{sale}"/>работать.


4
Там, где вам удобно, процессор аннотаций автоматически обнаруживает их во время компиляции.
Kiskae

Спасибо, я положил это в свой BindingUtils.java
nhoxbypass

но как установить стоимость продажи?
EslamWael74

1
как я могу применить тот же подход к тегам <include?
Зафер Джелалоглу 05

1
@ EslamWael74 вы устанавливаете стоимость продажи через привязку в вашем коде Java / Kotlin. Что-то вроде val binding = MyClassBinding.inflate (...), а затем вы можете просто вызвать binding.sale = true.
Мэтт Робертсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.