数据绑定 - 未按预期计算布尔条件



在我的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:可见性"的设置器 android.widget.TextView

有人知道出了什么问题吗?

试试这个

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

我检查了这种方法,因为它看起来不错。 它有效。但是,您可以检查模型的getter setter,查看XML中的类导入。

以下代码效果很好。

事件.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. 创建处理程序

事件处理程序.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}" />

就这样!

另一种方法

如果您不想添加新的处理程序类。您还可以将可见性方法放在模型类中。

1. 将获取文本可见性方法放入模型中

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}" />

您可以使用布尔到整数转换适配器。如果它是静态的(与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()}" />

最新更新