android:enabled属性的双向数据绑定

Mar*_*cin 5 android 2-way-object-databinding android-databinding

我试图找出Android中的双向数据绑定库。我想通过更改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">
Run Code Online (Sandbox Code Playgroud)

现在,我要执行此操作的原因是由于这两个选择器(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>
Run Code Online (Sandbox Code Playgroud)

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

当我尝试编译它时,出现错误

java.lang.RuntimeException:发现数据绑定错误。**** /数据绑定错误**** msg:在android.widget.LinearLayout上找不到值类型为boolean的属性“ android:enabled”的获取器。

viewModel.asd只是一个公共布尔/ ObservableBoolean,我都试过。

谁能解释这是怎么回事,为什么我会收到错误消息?我可以在View类(布局扩展)中看到isEnabled / setEnabled方法。

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

//编辑:我可能不需要双向绑定。.我不再知道 //编辑继续:它可能需要对ViewModel继承做一些事情:

布局文件具有类型为abMainViewModel的viewModel,但是字段asd是abBaseViewModel(MainViewModel扩展了BaseViewModel)。现在,我想要这样做的是,如果我从扩展BaseViewModel的任何其他视图更新asd字段,它将自动更新enabled属性。

它也不能与Strings ..我猜这是继承的东西

亲切的问候,Marcin

Geo*_*unt 5

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

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

您可能会收到这样的错误的另一个原因是模型可能没有可绑定的属性。您应该使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

或使用 ObservableFields:

public class ViewModel {
    public final ObservableBoolean asd = new ObservableField(true);
}
Run Code Online (Sandbox Code Playgroud)

没有这个,一种方式数据绑定只会在第一次工作——如果你改变了 ViewModel,UI 将不会更新。

您似乎不需要android:enabled属性的2 向数据绑定。数据应该可以很好地改变选择器状态的一种方式。