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

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}"/>работать.

Kiskae
источник
4
Там, где вам удобно, процессор аннотаций автоматически обнаруживает их во время компиляции.
Kiskae
Спасибо, я положил это в свой BindingUtils.java
nhoxbypass
но как установить стоимость продажи?
EslamWael74
1
как я могу применить тот же подход к тегам <include?
Зафер Джелалоглу 05
1
@ EslamWael74 вы устанавливаете стоимость продажи через привязку в вашем коде Java / Kotlin. Что-то вроде val binding = MyClassBinding.inflate (...), а затем вы можете просто вызвать binding.sale = true.
Мэтт Робертсон