EditText imeOptions和数据绑定不起作用

问题描述 投票:0回答:1

我正在尝试使用数据绑定在我的视图模型中处理imeOption actionDone。

[还有其他几篇文章没有提供我正在寻找的解决方案。我想使用BindingAdapter在XML中设置它来处理actionDone事件。在解决其他帖子之后,我不断收到不同的数据绑定错误。

我真的希望我能找到一个文档,概述所有数据绑定XML语法,以及为什么工作正常导致很多文档(包括官方的Android文档)混合使用lambda而不传递参数而不进行解释。甚至对其进行一点更改,并在gradle构建中出现绑定错误。

xml

<EditText
    android:id="@+id/passwordEdit"
    android:layout_width="0dp"
    android:layout_height="42dp"
    android:ems="10"
    android:text="@={mainViewModel.password}"
    android:inputType="textPassword"
    android:imeOptions="actionDone"
    app:onEditorActionDone="@{(view) -> mainViewModel.onEditorActionDone(view)}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/passwordTitle" />

ViewModel

@BindingAdapter({"onEditorActionDone"})
public void onEditorActionDone(EditText view) {
    AppLog.d(TAG, "-> onEditorActionDone()");

    view.setOnEditorActionListener((v, actionId, event) -> {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            //do login
        }
        //do nothing
    });
}

我已经尝试过app:onEditorActionDone="@{mainViewModel::onEditorActionDone}"app:onEditorActionDone="@{(view) -> mainViewModel.onEditorActionDone()}"app:onEditorActionDone="@{mainViewModel.onEditorActionDone}"

android android-databinding
1个回答
0
投票

您不需要自定义@BindingAdapter。试试这个:

<EditText
    android:id="@+id/passwordEdit"
    android:layout_width="0dp"
    android:layout_height="42dp"
    android:ems="10"
    android:text="@={mainViewModel.password}"
    android:inputType="textPassword"
    android:imeOptions="actionDone"
    android:onEditorAction="@{(view,actionId,event) -> viewModel.onEditorAction(view,actionId,event)}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/passwordTitle" />

并且您的视图模型类应实现TextView.OnEditorActionListener接口:

public class ViewModel implements TextView.OnEditorActionListener {       
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        Log.d("ViewModel", "onEditorAction");
        return false;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.