有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

验证Android数据绑定EditText设置错误

我们正在使用Kubwa验证库使用安卓数据绑定库验证表单,但是错误没有显示在EditText中

视图模型:

@Override
public void onLoginClick(View view) {

    validator.validateEmail(user.getEmail());
    validator.validatePassword(user.getPassword());

    notifyChange();

    if (validator.isValid()) connector.login(user);
}

@Bindable
@Override
public String getEmailError() {
    return validator.getEmailErrorMessage();
}

@Bindable
@Override
public String getPasswordError() {
    return validator.getPasswordErrorMessage();
}

和我的xml:

<EditText
安卓:id="@+id/email"
安卓:text="@={viewModel.user.email}"
app:error="@{viewModel.emailError}"/> <!-- As the wiki said -->

当我意识到这不起作用时,我创建了一个BindingAdapter并更改了xml属性,但它也不起作用

@BindingAdapter("app:errorText")
public static void BindError(EditText view, String error){
    view.setError(error);
}

非常感谢您的任何见解


共 (2) 个答案

  1. # 1 楼答案

    我尝试了一些类似于你的例子,效果很好

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        User user = new User();
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setUser(user);
    }
    

    我把验证放在集合名中的可观测值,但你的应该是相同的。您可能更喜欢将其放在InverseBindingAdapter中:

    public class User extends BaseObservable {
        private String name;
    
        @Bindable
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
            notifyPropertyChanged(com.example.gmount.tryoutdamnthing.BR.name);
            notifyPropertyChanged(com.example.gmount.tryoutdamnthing.BR.error);
        }
    
        @Bindable
        public String getError() {
            if (name == null || name.length() < 3) {
                return "Too short!";
            } else {
                return null;
            }
        }
    }
    

    布局如下:

    <layout>
        <data>
            <variable name="user" type="com.example.gmount.tryoutdamnthing.User"/>
        </data>
    
        <FrameLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:id="@+id/activity_main"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
        >
    
            <EditText
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@={user.name}"
                    app:error="@{user.error}"
            />
    
        </FrameLayout>
    </layout>
    

    我猜您没有使用DataBindingUtil.setContentView()或忘记在绑定中设置ViewModel对象。有时发生这种情况是因为人们在DataBindingUtil.setContentView()之后使用Activity.setContentView()

    您可以在这里看到,我不需要app:error的BindingAdapter,因为setter的名称与属性相同

  2. # 2 楼答案

    这更多的是关于如何使用数据绑定库的问题。您正在将errorText绑定到错误,但在布局中使用error。将BindingAdapter更改为@BindingAdapter({"app:error"})应该可以修复此错误