Почему метод onEditorAction не отлавливает нажатие Enter на программной клавиатуре при включенной русской раскладке, но отлавливает его на английской?

205
05 ноября 2017, 16:01

Прочитал на этом сайте и на его английском прародителе много схожих вопросов и ответов, перепробовал разные условия if, но так и не понял, почему в английской раскладке все работает так, как я и ожидаю, тогда как в русской - нажатие enter просто переводит в новую строку (неужели код нажатия клавиши зависит от раскладки?). У EditText задан атрибут inputType="textMultiLine".

public boolean onEditorAction(TextView textView, int actionId, KeyEvent event) {
if (event != null) {
if ((event.getKeyCode() == KeyEvent.KEYCODE_ENTER) &&
(event.getAction() == KeyEvent.ACTION_DOWN)) {
            // сохраняем текст, введенный до нажатия Enter в переменную
                currentMessage = editText.getText().toString();
                editText.setText("");
                return true;
        }
    }
    return false;
}

Пробовал менять KeyEvent.ACTION_DOWN на actionId == EditorInfo.IME_ACTION_SEND с предварительным editText.setImeActionLabel("SEND", EditorInfo.IME_ACTION_SEND);, но это не помогло.
Заранее благодарю за ответ.

Answer 1

Java

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            currentMessege = editText.getText().toString();
            setText(currentMessege);
            editText.setText("");
            handled = true;
        }
        return handled;
    }
});

XML

<EditText
    ...
    android:inputType="textImeMultiLine" //обязательно
    android:imeOptions="actionSend" />

Вместо textMultiLine Используйте android:inputType="textImeMultiLine" - проверил лично, работает на все 100% при русской и английской раскладке.

Документация

P.S. Вкратце, "Enter" на клавиатуре - это imeOptions (Specify the Input Method Action), существуют:

  • IME_ACTION_SEND (картинка письмо)
  • IME_ACTION_DONE (галочка)
  • IME_ACTION_SEARCH (лупа)

и т.д

в Java нужно обозначать .IME_ACTION_*, в xml android:imeOptions="action*"

READ ALSO
java.lang.NullPointerException TableView

java.lang.NullPointerException TableView

Если убрать комментарии, то вылазит ошибка

236
Android. Иногда SoundPool не воспроизводит мелодию

Android. Иногда SoundPool не воспроизводит мелодию

Проблема заключается в том, что бывает, при первом за день запуске приложения, SoundPool не воспроизводит мелодиюActivity запускается, а мелодии нет

170
Вшить SQLite.Interop в exe с помощью Costura.Fody

Вшить SQLite.Interop в exe с помощью Costura.Fody

После использования CosturaFody почти все dll пошли в exe, но пару dll, которые в папках, не могу закинуть в exe

289
Отправка сообщения от c# сервера

Отправка сообщения от c# сервера

Есть C# проект с GUIЕсть задача реализовать отправку сообщения по нажатию кнопки с сервера клиенту

258