Многострочный EditText с меткой действия Done SoftInput на 2.3
есть ли способ иметь многострочный EditText
представьте и используйте ярлык действия IME "сделано" на Android 2.3?
в Android 2.2 это не проблема, кнопка enter показывает ярлык действия IME "Done" (android:imeActionLabel="actionDone"
), и отклоняет мягкий ввод при нажатии.
при настройке EditText
для многострочного, Android 2.3 удаляет возможность показать" сделано " действие для клавиатуры мягкого ввода.
мне удалось изменить поведение мягкие Вход введите кнопку с помощью KeyListener
, однако кнопка enter по-прежнему выглядит как клавиша enter.
вот объявление EditText
<EditText
android:id="@+id/Comment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="0dp"
android:lines="3"
android:maxLines="3"
android:minLines="3"
android:maxLength="60"
android:scrollHorizontally="false"
android:hint="hint"
android:gravity="top|left"
android:textColor="#888"
android:textSize="14dp"
/>
<!-- android:inputType="text" will kill the multiline on 2.3! -->
<!-- android:imeOptions="actionDone" switches to a "t9" like soft input -->
когда я проверяю inputType
значение после загрузки настройки представления содержимого в действии, оно отображается как:
inputType = 0x20001
что:
- класс =
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
- flags =
InputType.TYPE_TEXT_FLAG_MULTI_LINE
7 ответов:
Ну, после перечитывания
TextView
иEditorInfo
docs, стало ясно, что платформа собирается заставитьIME_FLAG_NO_ENTER_ACTION
для многострочных текстовых представлений.отметим, что
TextView
автоматически установите этот флаг для вас на мульти-линии текстовые представления.мое решение-подкласс
EditText
и настроить параметры IME после того, как платформа настроить их:@Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection connection = super.onCreateInputConnection(outAttrs); int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION; if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) { // clear the existing action outAttrs.imeOptions ^= imeActions; // set the DONE action outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE; } if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) { outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; } return connection; }
в приведенном выше, я заставляю
IME_ACTION_DONE
тоже, хотя это может быть достигнуто за счет утомительной конфигурации макета.
ответ Ohhorob в основном правильный, но его код действительно действительно избыточен! Это в основном эквивалентно этой гораздо более простой версии (полный код для ленивых читателей):
package com.example.views; import android.content.Context; import android.util.AttributeSet; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.widget.EditText; // An EditText that lets you use actions ("Done", "Go", etc.) on multi-line edits. public class ActionEditText extends EditText { public ActionEditText(Context context) { super(context); } public ActionEditText(Context context, AttributeSet attrs) { super(context, attrs); } public ActionEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection conn = super.onCreateInputConnection(outAttrs); outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; return conn; } }
обратите внимание, что некоторые
inputType
опции, такие какtextShortMessage
сделать это не получится! Я предлагаю вам начать сinputType="text"
. Вот как вы можете использовать его в XML.<com.example.views.ActionEditText android:id=... android:layout_stuff=... android:imeOptions="actionDone" android:inputType="textAutoCorrect|textCapSentences|textMultiLine" android:maxLines="3" />
альтернативным решением для подкласса класса EditText является настройка экземпляра EditText следующим образом:
editText.setHorizontallyScrolling(false); editText.setMaxLines(Integer.MAX_VALUE);
по крайней мере, это работает для меня на Android 4.0. Он настраивает экземпляр EditText так, чтобы пользователь редактировал однострочную строку, которая отображается с мягкой оберткой на нескольких строках, даже если задано действие IME.
после предыдущего ответа
public class MultiLineText extends EditText { public MultiLineText(Context context) { super(context); } public MultiLineText(Context context, AttributeSet attrs) { super(context, attrs); } public MultiLineText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection connection = super.onCreateInputConnection(outAttrs); int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION; if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) { // clear the existing action outAttrs.imeOptions ^= imeActions; // set the DONE action outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE; } if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) { outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; } return connection; } }
используйте этот тег как
<myapp.commun.MultiLineText android:id="@+id/textNotes" android:layout_height="wrap_content" android:minHeight="100dp" android:layout_width="wrap_content" android:hint="Notes" android:textSize="20sp" android:padding="7dp" android:maxLines="4"/>
для выполнения действия вы можете использовать:
XML
android:inputType="text|textCapSentences"
JAVA
editText.setHorizontallyScrolling(false); editText.setMaxLines(Integer.MAX_VALUE);
Я надеюсь, что его работа для вас.
по-видимому, ответ на исходный вопрос-Да, но я считаю, что команда Android пытается заставить разработчиков немного подумать о том, как они используют многострочный EditText. Они хотят, чтобы клавиша enter добавляла новые строки и, вероятно, ожидала, что вы предоставите кнопку или другое средство ввода, чтобы вызвать событие, которое вы редактируете.
У меня такая же проблема, и моим очевидным решением было просто добавить кнопку "Готово" и позволить кнопке ввода добавить новые строки.