Многострочный 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"