DataBinding-不评估布尔条件

时间:2019-01-22 07:57:03

标签: java android conditional-statements android-databinding

在我的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:找不到参数类型为boolean的属性'android:visibility'的设置器   android.widget.TextView

有人知道怎么了吗?

3 个答案:

答案 0 :(得分:1)

我检查了这种方法,因为它看起来还可以。而且有效。但是,您可以检查Model的getter setter,XML中的View类导入。

遵循代码的要求很好。

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>

建议:

在Handler中移动逻辑部分。

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

答案 1 :(得分:0)

尝试

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

答案 2 :(得分:0)

您可以将布尔型转换为int转换适配器。如果它是静态的(与BindingAdapter相同),它将转换需要整数的布尔字段(例如View.VISIBLE)。

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

在XML中,您将使用返回boolean值的方法:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="@{event.isMessageVisible()}" />