Я проверил этот подход, потому что он выглядит хорошо. и это работает. Однако вы можете проверить установщик получателя 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}" />