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

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 добавляла новые строки и, вероятно, ожидала, что вы предоставите кнопку или другое средство ввода, чтобы вызвать событие, которое вы редактируете.

У меня такая же проблема, и моим очевидным решением было просто добавить кнопку "Готово" и позволить кнопке ввода добавить новые строки.

используйте эти атрибуты в XML.

android: inputType= "textImeMultiLine"

android: imeOptions= "actionDone"