gpt4 book ai didi

android - 如何让数据绑定(bind)表达式对同一布局中 EditText 的更改使用react?

转载 作者:太空狗 更新时间:2023-10-29 13:46:43 25 4
gpt4 key购买 nike

假设我有一个 ID 为 fooEditText。在同一布局资源的其他地方,我有一个 Button,我想仅当 EditText 中有文本时才启用 Button

我认为这会起作用:

        <Button
android:id="@+id/bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{listener}"
android:text="Um, hi!"
android:enabled="@{foo.text.length > 0}" />

生成的绑定(bind)类确实会根据 foo 中文本的长度在 bar 上调用 setEnabled()... 但仅当调用 executeBindings() 时。这似乎不会在用户键入时被调用,因此我的 Button 的启用状态不会根据用户在 EditText 中输入的文本而改变。

我可以解决这个问题,但感觉应该可行。有什么我想念的吗?这是已知的限制吗?

最佳答案

更新

只需将 foo.text.length 更改为 foo.text.length()


旧解决方案

一些要点,也许你错过了。

1。使用 BaseObservable

如果你的model extends BaseObservable 那么你需要制作food.text @Bindable.

public class UserBaseObservable extends BaseObservable {
private String name;

@Bindable
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
}

原因 是,当您使用 text.length 时,您需要在更改时调用所有相关元素。因为 text.length 是不可观察的,所以你需要手动调用它。生成的绑定(bind)类调用 setName(value) 但它不会更改 text.length 依赖 View 。

2。使用 MutableLiveData

如果您使用MutableLiveData,那么必须提供LifeCycleOwner

    binding.setLifecycleOwner(this);

3。使用 ObservableField(最短方法)

另一种简单的方法是为 foo.text 使用 ObservableField

我说简单是因为在这种情况下您不需要使该字段可绑定(bind)

public class UserObservableField {
private ObservableField<String> name = new ObservableField<>();

public ObservableField<String> getName() {
return name;
}

public void setName(ObservableField<String> name) {
this.name = name;
}
}

我用其中 3 个解决方案创建了一个示例,所有解决方案都有效!

activity_login.xml

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

<data>

<variable
name="userObservableField"
type="com.innovanathinklabs.sample.activities.LoginActivity.UserObservableField"/>

<variable
name="userMutable"
type="com.innovanathinklabs.sample.activities.LoginActivity.UserMutable"/>

<variable
name="userBaseObservable"
type="com.innovanathinklabs.sample.activities.LoginActivity.UserBaseObservable"/>

</data>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Enter your name"
android:text="@={userObservableField.name}"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="@{userObservableField.name.length()>0}"
android:text="Proceed"/>

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Enter your name"
android:text="@={userMutable.name}"
/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="@{userMutable.name.length()>0}"
android:text="Proceed"/>

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Enter your name"
android:text="@={userBaseObservable.name}"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="@{userBaseObservable.name.length()>0}"
android:text="Proceed"/>

</LinearLayout>
</layout>

LoginActivity.java

public class LoginActivity extends AppCompatActivity {
ActivityLoginBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_login);
binding.setLifecycleOwner(this); // necessary for LiveData to work
binding.setUserObservableField(new UserObservableField());
binding.setUserBaseObservable(new UserBaseObservable());
binding.setUserMutable(new UserMutable());
}

public static class UserObservableField {
private ObservableField<String> name = new ObservableField<>();

public ObservableField<String> getName() {
return name;
}

public void setName(ObservableField<String> name) {
this.name = name;
}
}


public static class UserBaseObservable extends BaseObservable {
private String name;

// necessary for updating button
@Bindable
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
}


public static class UserMutable {
private MutableLiveData<String> name = new MutableLiveData<>();

public MutableLiveData<String> getName() {
return name;
}

public void setName(MutableLiveData<String> name) {
this.name = name;
}
}
}

我将所有模型都放在 Activity 中。我尽力解释清楚了,如果您有任何困惑,可以发表评论。

输出

output image

关于android - 如何让数据绑定(bind)表达式对同一布局中 EditText 的更改使用react?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52487750/

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