¿Hay alguna forma de tener una multilínea EditText
presente y usar la etiqueta de acción IME "Listo" en Android 2.3?
En Android 2.2 esto no es un problema, el botón Enter muestra la etiqueta de acción IME "Listo" ( android:imeActionLabel="actionDone"
) y descarta la entrada suave cuando se hace clic.
Al configurar una EditText
multilínea, Android 2.3 elimina la capacidad de mostrar la acción "Listo" para el teclado de entrada suave.
Me las arreglé para alterar el comportamiento del botón Enter Soft Input usando a KeyListener
, sin embargo, el botón Enter todavía parece una tecla enter.
Aquí está la declaración del 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 -->
Cuando verifico el inputType
valor después de cargar la configuración de la vista de contenido en la actividad, aparece como:
inputType = 0x20001
Cual es:
- clase =
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
- banderas =
InputType.TYPE_TEXT_FLAG_MULTI_LINE
fuente
EditText
, por lo que no está en mi xml de actividad. He intentado poner este código en mi actividad, pero da un error:The method onCreateInputConnection(EditorInfo) of type SMSMain must override or implement a supertype method
. Llamassuper
al principio, así que no estoy seguro de cuál es el problema. ¿Tienes alguna sugerencia? Gracias.La respuesta de Ohhorob es básicamente correcta, ¡pero su código es realmente redundante! Básicamente es equivalente a esta versión mucho más simple (código completo para lectores perezosos):
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; } }
Tenga en cuenta que algunas
inputType
opciones, comotextShortMessage
hacer que esto no funcione. Te sugiero que comiences coninputType="text"
. Así es como puede usarlo en su XML.<com.example.views.ActionEditText android:id=... android:layout_stuff=... android:imeOptions="actionDone" android:inputType="textAutoCorrect|textCapSentences|textMultiLine" android:maxLines="3" />
fuente
Una solución alternativa a la subclasificación de la clase EditText es configurar su instancia de EditText con esto:
editText.setHorizontallyScrolling(false); editText.setMaxLines(Integer.MAX_VALUE);
Al menos, esto me funciona en Android 4.0. Configura la instancia de EditText para que el usuario edite una cadena de una sola línea que se muestra con ajuste suave en varias líneas, incluso si se establece una acción IME.
fuente
Siguiendo la respuesta anterior
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; } }
Usa esto como
<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"/>
fuente
para poner la acción Hecho, puede usar:
XML
android:inputType="text|textCapSentences"
JAVA
editText.setHorizontallyScrolling(false); editText.setMaxLines(Integer.MAX_VALUE);
Espero que funcione para ti.
fuente
Aparentemente, la respuesta a la pregunta original es Sí, pero creo que el equipo de Android está tratando de hacer que los desarrolladores piensen un poco sobre cómo usan EditText multilínea. Quieren que la tecla Intro agregue nuevas líneas y probablemente esperan que proporciones un botón u otro medio de entrada para generar el evento que terminaste de editar.
Tengo el mismo problema y mi solución obvia fue simplemente agregar un botón de hecho y dejar que el botón de entrar agregue las nuevas líneas.
fuente
Utilice estos atributos en su XML.
fuente