Використовуйте прив’язку даних, щоб встановити видимість перегляду


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
і як встановити значення "продаж"?
RobinHood

Отже, ви маєте на увазі, як присвоїти значення "продаж" змінної рядка?
Девід Артманн

саме так! Я стикаюся з проблемою. Будь ласка, поділіться, я порівняю, а потім повідомлю вас.
RobinHood

39
Блін! Як я пропустив Дурний імпорт . Готово, дякую.
RobinHood

Гей! будь-яка ідея, чому глюк позиції на прокрутці? Адаптер
RobinHood

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>?
Sourav Bagchi

41

Проблема полягає в тому, що visibilityперебуваєте в Integerна Viewкласі, це означає , що є два шляхи , щоб зробити цю роботу:

  1. Використовуйте View.VISIBLEі View.GONEконстанти. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Визначте власний сеттер, visibilityякий займає a 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
як я можу застосувати той самий підхід до <включати теги?
Zafer Celaloglu

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