DataBinding - логическое условие не оценивается должным образом - PullRequest
0 голосов
/ 22 января 2019

В моем xml я устанавливаю условие видимости для управления следующим образом:

android:visibility="@{event.isMessage?(event.dateEventText!=null? View.VISIBLE:View.GONE):View.VISIBLE}"

Итак, если event.isMessage истинно, это: (event.dateEventText!=null? View.VISIBLE:View.GONE) должно быть оценено, в противном случае, View.VISIBE должно быть возвращено.

Но привязка данных выдает сообщение об ошибке:

**** / ошибка привязки данных **** msg: не удается найти установщик для атрибута 'android: visibility' с типом параметра boolean on android.widget.TextView

Кто-нибудь знает, что не так?

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Я проверил этот подход, потому что он выглядит хорошо. и это работает. Однако вы можете проверить установщик получателя Model, Просмотреть импорт класса в XML.

Следующий код работает хорошо.

Event.class

public class Event {
    boolean isMessage;
    String dateEventText;

    public boolean isMessage() {
        return isMessage;
    }

    public void setMessage(boolean message) {
        isMessage = message;
    }

    public String getDateEventText() {
        return dateEventText;
    }

    public void setDateEventText(String dateEventText) {
        this.dateEventText = dateEventText;
    }
}

layout_text.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <import type="android.view.View" />

        <variable
            name="event"
            type="com.innovanathinklabs.sample.data.Event" />

    </data>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="@{event.isMessage?(event.dateEventText!=null? View.VISIBLE:View.GONE):View.VISIBLE}" />

</layout>

Предложение:

Переместите свою логическую часть в обработчик.

1. Создать обработчик

EventHandler.class

public class EventHandler {
    private Event event;

    public EventHandler(Event event) {
        this.event = event;
    }

    public int getTextVisibility() {
        if (event.isMessage && event.dateEventText != null) return View.VISIBLE;
        else return View.GONE;
    }
}

2. Обработчик импорта в макете

    <variable
        name="handler"
        type="com.innovanathinklabs.sample.data.EventHandler" />

3. Установить значение обработчика из действия

activity.setHandler(new EventHandler(yourEventModel))

4. Используйте метод обработчика, чтобы установить видимость

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="@{handler.textVisibility}" />

Вот и все!

Другой подход

Если вы не хотите добавлять новый класс Handler. Вы также можете разместить метод видимости в классе модели.

1. Поместите метод getTextVisibility в модель

public class Event{
    // other variables
    public int getTextVisibility() {
        if (event.isMessage && event.dateEventText != null) return View.VISIBLE;
        else return View.GONE;
    }
}

2. Использовать в макете

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="@{event.textVisibility}" />
0 голосов
/ 25 января 2019

Адаптер преобразования логического значения в int может быть.Если он статический (так же, как BindingAdapter), он будет преобразовывать логические поля, которые ожидают целое число (например, View.VISIBLE).

@BindingConversion
int convertBooleanToVisibility(boolean isVisible) {
    return isVisible ? View.VISIBLE : View.GONE;
}

В XML вы будете использовать свой метод, который возвращает логическое значение для видимости:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="@{event.isMessageVisible()}" />
0 голосов
/ 22 января 2019

Попробуйте это

.
.
.
android:visibility="@{event.isMessage &amp;&amp; event.dateEventText!=null ?  View.VISIBLE : View.GONE}"
.
.
.
...