Многострочный EditText с меткой действия Done SoftInput 2.3 - PullRequest
80 голосов
/ 16 февраля 2011

Есть ли способ представить Multi-Line EditText и использовать ярлык действия IME «Готово» на Android 2.3?

В Android 2.2 это не проблема, кнопка ввода показываетЯрлык действия IME «Готово» (android:imeActionLabel="actionDone") и отклоняет программный ввод при нажатии.

При настройке EditText для многострочного Android 2.3 удаляет возможность показа действия «Готово» дляКлавиатура мягкого ввода.

Мне удалось изменить поведение кнопки ввода мягкого ввода с помощью 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

Ответы [ 7 ]

161 голосов
/ 18 февраля 2011

Что ж, после перечитывания документов 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, хотя этого можно добиться с помощью утомительной конфигурации макета.

101 голосов
/ 24 сентября 2012

Ответ Охороба в основном правильный, но его код действительно действительно избыточен!Это в основном эквивалентно этой гораздо более простой версии (полный код для ленивых читателей):

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" />
55 голосов
/ 26 ноября 2012

Альтернативным решением для создания подкласса класса EditText является настройка вашего экземпляра EditText следующим образом:

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

По крайней мере, это работает для меня на Android 4.0.Он настраивает экземпляр EditText таким образом, чтобы пользователь редактировал однострочную строку, которая отображается с мягким переносом на несколько строк, даже если установлено действие IME.

6 голосов
/ 05 ноября 2015

После предыдущего ответа

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 голосов
/ 09 декабря 2015

для выполнения действия Готово, вы можете использовать:

XML

android:inputType="text|textCapSentences"    

JAVA

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

Я надеюсь, что это сработает для вас.

1 голос
/ 26 мая 2011

Очевидно, что ответ на оригинальный вопрос - Да, но я верю, что команда Android пытается заставить разработчиков задуматься немного о том, как они используют многострочный EditText.Они хотят, чтобы клавиша ввода добавляла новые строки, и, вероятно, ожидают, что вы предоставите кнопку или другое средство ввода, чтобы вызвать событие, которое вы закончили редактировать.Готово, и кнопка ввода добавляет новые строки.

0 голосов
/ 07 ноября 2017

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

андроида: inputType = "textImeMultiLine"

Android: imeOptions = "actionDone"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...