【问题标题】:Attempt to do a two way binding results in "cannot be inverted error"尝试进行双向绑定会导致“无法反转错误”
【发布时间】:2020-03-19 20:30:59
【问题描述】:

您好,我正在尝试进行双向绑定。我试图在 XML 文件中绑定的属性是。

android:visibility="@={chart.ShowProgress ? View.VISIBLE : View.GONE}"

在文件 ChartViewModel 文件中:

private int mShowProgress = View.GONE;

public int getShowProgress() {
    if (mColor.colorId == mColorId) {
        return mShowProgress;
    }
    mShowProgress = View.GONE;
    return mShowProgress;
}

public void setShowProgress(@NonNull int isProgressVisible) {
    this.mShowProgress = isProgressVisible;
}

但是,当我尝试构建时出现错误

The expression '((chartShowProgress) ? (android.view.View.VISIBLE) : 
(android.view.View.GONE))' cannot be inverted, so it cannot be used in a two-way binding

Details: The condition of a ternary operator must be constant: 
android.databinding.tool.writer.KCode@18e15570

请有人指出我做错了什么?谢谢!

【问题讨论】:

  • 嗨,您是否在布局中导入了 View 类?
  • 嗨@Zain,是的。我已经实现了一个 CharViewModel 类。我已更新我的问题以包含此信息。
  • 对不起,我的意思是将这个 <import type="android.view.View"/> 添加到 <layout><data> 标签中
  • 对不起,我误会了。是的。我已经在侧面布局中导入了它。
  • 我看不到@BindingAdapter注解..你能提供吗

标签: java android data-binding


【解决方案1】:

我试图重现该问题,而您收到此错误的原因是您尝试使用带有三元表达式的双向数据绑定。

android:visibility="@={chart.ShowProgress ? View.VISIBLE : View.GONE}"

这是看到此错误的正常行为,因为双向数据绑定不仅旨在将值从 java 映射到 XML 布局,而且还将它们从 XML 映射回它们在 java 中的存储。因此,根据您的表达式,您希望将布尔值 chart.ShowProgress 映射到某个小部件的可见性;但是如何在将 XML 映射回 java 时进行反向操作(如何使用此三元表达式 chart.ShowProgress ? View.VISIBLE : View.GONE 将小部件的可见性映射回 java .. 使用双向数据绑定无法做到这一点的答案,以及这就是引发此异常的原因。

所以要解决你的问题,你需要从表达式中删除等号,所以它应该是:

android:visibility="@{chart.ShowProgress ? View.VISIBLE : View.GONE}"

【讨论】:

猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2019-09-11
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多