Есть ли способ иметь многострочность EditText
и использовать метку действия IME «Готово» на Android 2.3?
В Android 2.2 это не проблема, кнопка ввода показывает метку действия IME «Готово» ( android:imeActionLabel="actionDone"
) и закрывает мягкий ввод при нажатии.
При настройке EditText
для многострочного режима Android 2.3 удаляет возможность отображать действие «Готово» для клавиатуры мягкого ввода.
Мне удалось изменить поведение кнопки ввода мягкого ввода с помощью a KeyListener
, однако кнопка ввода по-прежнему выглядит как клавиша ввода.
Вот декларация 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
Который:
- class =
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
- флаги =
InputType.TYPE_TEXT_FLAG_MULTI_LINE
источник
EditText
, поэтому его нет в моем действии xml. Я пытался поставить этот код в моей деятельности, но получил сообщение об ошибке:The method onCreateInputConnection(EditorInfo) of type SMSMain must override or implement a supertype method
. Вы звонитеsuper
в начале, поэтому не знаете, в чем проблема. Есть предложения? Благодарю.Ответ Охороба в основном правильный, но его код действительно избыточен! Это в основном эквивалентно этой гораздо более простой версии (полный код для ленивых читателей):
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"/>
источник
для выполнения действия Done вы можете использовать:
XML
android:inputType="text|textCapSentences"
ЯВА
editText.setHorizontallyScrolling(false); editText.setMaxLines(Integer.MAX_VALUE);
Надеюсь, это сработает для вас.
источник
По-видимому, ответ на исходный вопрос - Да, но я считаю, что команда Android пытается заставить разработчиков немного подумать о том, как они используют многострочный EditText. Они хотят, чтобы клавиша ввода добавляла новые строки, и, вероятно, ожидают, что вы предоставите кнопку или другое средство ввода, чтобы вызвать событие, редактирование которого вы закончили.
У меня такая же проблема, и моим очевидным решением было просто добавить кнопку «Готово» и позволить кнопке ввода добавить новые строки.
источник
Используйте этот атрибут в своем XML.
источник