android - android :enabled attribute的双向数据绑定(bind)

标签 android android-databinding 2-way-object-databinding

我正在尝试找出 Android 中的双向数据绑定(bind)库。我想通过更改 xml 中的 android:enabled 属性来启用/禁用 LinearLayout(以及内部的 RelativeLayout)。

XML 部分如下所示:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"
    android:layout_margin="5dp"
    android:gravity="center"
    android:enabled="@={viewModel.asd}"
    ndroid:onClick="@{()-> viewModel.doSomething()}"
    android:background="@drawable/shortcut_button_label_selector"
    android:orientation="horizontal">

    <RelativeLayout
        android:layout_width="40dp"
        android:layout_height="match_parent"
        android:enabled="@={viewModel.asd}"
        android:background="@drawable/shortcut_button_icon_selector">

现在,我想这样做的原因是因为这两个选择器(shortcut_button_label_selector 和 shortcut_button_icon_selector),它们看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:state_enabled="false"
        android:drawable="@color/grey_300"></item>
    <item
        android:state_enabled="true"
        android:drawable="@color/menubar_background"></item>

</selector>

我希望能够根据 View 上的 enabled 属性动态更改背景。我选择 enabled 属性的原因是我在 LinearLayout 上获得了 onClick 事件,我需要禁用它(使其不可点击);我对 android:clickable 属性也有同样的问题。

问题是当我尝试编译它时出现错误

java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Cannot find the getter for attribute 'android:enabled' with value type boolean on android.widget.LinearLayout.

viewModel.asd 只是一个公共(public) bool 值/ObservableBoolean,我都试过了。

谁能解释发生了什么以及为什么我会收到错误?我可以在 View 类(布局扩展)中看到 isEnabled/setEnabled 方法。

有什么方法可以让我继续我的方法,还是必须完全改变它?

//编辑:我可能不需要双向绑定(bind)..我不知道了 //编辑继续:它可能必须对我的 ViewModel 继承做一些事情:

布局文件有一个类型为 a.b.MainViewModel 的 viewModel,但字段 asd 是 int a.b.BaseViewModel(MainViewModel 扩展了 BaseViewModel)。现在我想要的是,如果我从扩展 BaseViewModel 的任何其他 View 更新 asd 字段,它会自动更新已启用的属性。

它也不适用于字符串。我猜这是继承问题

亲切的问候, 马尔辛

最佳答案

您的错误可能有多种原因。第一个是双向数据绑定(bind)不适用于 android:enabled 属性。这是因为没有回调告诉数据绑定(bind)属性已更改。

双向数据绑定(bind)适用于用户输入数据的大多数属性,因此最容易将其视为将数据从用户获取到模型。

您可能会收到类似错误的另一个原因是模型可能没有可绑定(bind)的属性。您应该使用 Observable:

public class ViewModel extends BaseObservable {
    private boolean asd = true;

    @Bindable
    public boolean getAsd() { return asd; }

    public void setAsd(boolean asd) {
        this.asd = asd;
        notifyPropertyChanged(this, BR.asd);
    }
}

或使用 ObservableFields:

public class ViewModel {
    public final ObservableBoolean asd = new ObservableField(true);
}

如果没有这个,数据绑定(bind)的一种方式只会在第一次起作用——如果您更改 ViewModel,UI 将不会更新。

android:enabled 属性似乎不需要双向数据绑定(bind)。数据应该可以正常工作以更改选择器状态的一种方式。

关于android - android :enabled attribute的双向数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42878240/

相关文章:

java - 我如何通过ArrayAdapter用ArrayList填充Spinner?

android - Android MVVM + 数据绑定(bind) + 架构组件示例(ViewModel 和 Room)

Android DataBinding, View 标签在 View :null 上不正确

android - 数据绑定(bind)和 MutableLiveData 的问题

android - Gradle buildDir不会移动构建文件夹内的所有文件夹

android - 当我尝试将 Analytics 与通知一起使用时,Firebase 中没有静态方法 zzUr()

android - 填充布局时如何使用适配器

android - 如何使用 Android 数据绑定(bind)从 UI 更新对象?

javascript - polymer 组件间数据绑定(bind)?

wpf - 如何在wpf中的单向数据绑定(bind)中控制 "update trigger"?