gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:30 25 4
gpt4 key购买 nike

我正在尝试找出 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com