Как реализовать многострочный 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);