EditText imeOptions и привязка данных не работает - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь обработать imeOption actionDone в моей модели представления, используя привязку данных.

Есть пара других сообщений, которые не дают решения, которое именно то, что я ищу. Я хочу установить это в XML с BindingAdapter для обработки события actionDone. Я продолжаю получать различные ошибки привязки данных после решений других постов.

Я действительно sh Я мог найти do c, в котором описан весь синтаксис привязки данных XML и почему все работает, что вызывает много Документы (включая официальные Android) используют смесь лямбда-выражений без / пропускаемых параметров без объяснения причин. измените это даже немного и ошибки привязки в сборке 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}"

1 Ответ

2 голосов
/ 24 января 2020

Вам не нужно настраивать @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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...