2016-03-31 13 views
11

У меня есть 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?

ответ

24

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

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

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

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

+0

Вы уверены, что это сработало? Я не могу заставить его работать – silverFoxA

+0

@silverFox да, это сработало для меня. Какие свойства вы определяете для своего EditText в xml? – Ruslan

+0

спасибо, что это сработало – silverFoxA

13

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

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

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

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

editText.setHorizontallyScrolling(false); 
+0

inputType = text & imeOptions = actionDone в xml и setHorizontallyScrolling() в коде сделал это! Спасибо, наконец. – Borzh

15

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

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

и в XML:

android:inputType="textMultiLine" 

Multi-line EditText with Done action button

+1

Только один из них работал для меня, и он работал как шарм - кнопка «Готово» отображалась и работала, только одна строка была видна, когда EditText изначально пуст, и расширяется до большего количества строк, когда пользователь вводит в OR, добавлено больше текста из кода (setText). – javaxian

+5

Было бы неплохо привести источник: http://stackoverflow.com/a/41022589/4607733 – horcrux

+1

Спасибо, после поиска часов вы были правы, это не работает только путем изменения xml. Какой беспорядок ... – Annihil

 Смежные вопросы

  • Нет связанных вопросов^_^