Как реализовать многострочный EditText с кнопкой ActionDone (без кнопки ввода)

У меня есть EditText, который используется для ввода содержимого сообщений (электронной почты, смс). Я хочу, чтобы сообщение было немедленно отправлено на кнопку ActionDone. Для этого я использую следующий код:

message.setOnEditorActionListener((textView, i, keyEvent) -> {
            switch (i) {
                case EditorInfo.IME_ACTION_DONE:
                    if (messageCanBePosted()) {
                        SoftKeyboard.hide(message);
                        postMessage();
                        return true;
                    } else {
                        return false;
                    }
                default:
                    return false;
            }
        }); 

Но также я хочу, чтобы это поле сообщения было многострочным, как в любых других приложениях для обмена сообщениями. Я могу добиться этого с помощью этой строки:

android:inputType="textMultiLine"

Проблема в том, что после добавления этой строки кнопка ActionDone начинает действовать, как кнопка Enter. Поэтому мой callback для EditorInfo.IME_ACTION_DONE никогда не вызывается. Поэтому каждый раз, когда пользователь нажимает эту кнопку, курсор перемещается в новую строку вместо отправки сообщения.

Как сохранить как многострочное поведение EditText (возможность отображения текста на нескольких строках), так и кнопку ActionDone?

Ответ 1

Наконец, после поиска здесь для подобных потоков я нашел решение. Просто добавьте эти строки в свой Activity/Fragment:

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

По какой-то причине это не сработает, если вы применяете точно такую же настройку из xml. Вы должны делать это программно.

Существует еще одно возможное решение - получить из EditText и вручную применить EditorInfo.IME_ACTION_DONE. Но для меня первое решение выглядит проще.

Ответ 2

использование

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

и в XML:

android:inputType="textMultiLine"

Источник: Multi-Line EditText с кнопкой "Готово"

Ответ 3

Продолжаю говорить Руслан. Трюк работал, но есть еще одна вещь, о которой вам нужно позаботиться в XML.

EditText должен иметь text типа ввода, иначе actionDone не будет работать. Тип ввода по умолчанию EditText позволяет пользователю вводить разрывы строк, поэтому inputType должен быть установлен в text т.е.

android:inputType="text"
//And of course
android:imeOptions="actionDone"

И в вашем классе java вам нужно добавить:

editText.setHorizontallyScrolling(false);