Многострочный EditText с Done SoftInput Action Label на 2.3
Есть ли способ присутствия Multi-Line EditText
и использовать ярлык Action для IME "Готово" на Android 2.3?
В Android 2.2 это не проблема, кнопка ввода показывает IME Action Label "Done" (android:imeActionLabel="actionDone"
) и отклоняет Soft Input при нажатии.
При настройке EditText
для нескольких строк Android 2.3 удаляет возможность показывать действие "Готово" для клавиатуры Soft Input.
Мне удалось изменить поведение кнопки ввода мягкого ввода с помощью 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
- flags =
InputType.TYPE_TEXT_FLAG_MULTI_LINE
Ответы
Ответ 1
Хорошо, после повторного чтения документов TextView
и EditorInfo
стало ясно, что платформа будет вынуждать 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
тоже, хотя это может быть достигнуто за счет утомительной компоновки компоновки.
Ответ 2
Ответ на 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" />
Ответ 3
Альтернативным решением для подклассификации класса EditText является настройка экземпляра EditText следующим образом:
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
По крайней мере, это работает для меня на Android 4.0. Он настраивает экземпляр EditText, чтобы пользователь редактировал строку с одной строкой, которая отображается с мягкой упаковкой на нескольких строках, даже если установлено действие IME.
Ответ 4
После предыдущего ответа
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"/>
Ответ 5
для выполнения действия "Готово" вы можете использовать:
XML
android:inputType="text|textCapSentences"
JAVA
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
Я надеюсь, что его работа для вас.
Ответ 6
По-видимому, ответ на исходный вопрос: Да, но я считаю, что команда Android пытается заставить разработчиков немного подумать о том, как они используют многострочный EditText. Они хотят, чтобы клавиша ввода добавляла новые строки и, вероятно, ожидала, что вы предоставите кнопку или другое средство ввода, чтобы поднять событие, в котором вы закончили редактирование.
У меня есть одна и та же проблема, и моим очевидным решением было просто добавить кнопку "Готово", и кнопка ввода добавит новые строки.
Ответ 7
Используйте этот атрибут в своем XML.
Android: inputType = "textImeMultiLine"
Android: imeOptions = "actionDone"