【问题标题】:DataBinding - boolean condition not evaluated as it shouldDataBinding - 没有按应有的方式评估布尔条件
【发布时间】:2019-06-15 15:32:33
【问题描述】:

在我的 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”的设置器 android.widget.TextView

有人知道怎么回事吗?

【问题讨论】:

  • 我试过你的代码,它没有编译器错误,尝试清理项目,使现金无效并重新启动 AS。

标签: java android conditional-statements android-databinding


【解决方案1】:

试试这个

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

【讨论】:

  • 语法错误&&未转义,我也不明白为什么第一种方法不起作用
  • 您是否使用 标签覆盖整个 xml 布局?这应该可以按预期工作,我会自己尝试一下
  • 我也不知道为什么第一种方法不起作用,看答案,我更新为 &&
  • 我做到了,我已经有了一些简单的条件,它们有效。
  • 很奇怪,我认为第一种方法没有错误
【解决方案2】:

我检查了这种方法,因为它看起来不错。它有效。但是,您可以检查模型的 getter setter、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>

建议:

在 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方法放到Model中

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

【讨论】:

【解决方案3】:

您可以使用 boolean 到 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()}" />

【讨论】:

  • 为什么我应该使用它而不是 getter 返回int?我想好处是它会自动转换所有出现的事件?就像 wpf 绑定中的转换器
  • 是的,正是.. 好处是,您可以在任何地方使用布尔标志来显示/隐藏(可见/消失)视图
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多