Texto Edit de Multiline con etiqueta de acción de entrada suave realizada en 2.3

¿Hay alguna manera de tener un EditText Multi-Line presente y usar la Etiqueta de Acción IME “Hecho” en Android 2.3?

En Android 2.2 esto no es un problema, el botón enter muestra la etiqueta de acción IME “Hecho” ( android:imeActionLabel="actionDone" ), y descarta la entrada suave cuando se hace clic.

Al configurar un EditText para EditText múltiples, Android 2.3 elimina la capacidad de mostrar la acción “Done” para el teclado Soft Input.

Me las arreglé para modificar el comportamiento del botón de entrada de entrada suave usando un KeyListener , sin embargo, el botón enter todavía se parece a una tecla Intro.


Aquí está la statement de EditText

    

Cuando compruebo el valor de inputType después de cargar configurando la vista de contenido en la actividad, aparece como:

 inputType = 0x20001 

Cual es:

  • clase = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • flags = InputType.TYPE_TEXT_FLAG_MULTI_LINE

Bueno, después de volver a leer los documentos TextView y EditorInfo , ha quedado claro que la plataforma va a forzar IME_FLAG_NO_ENTER_ACTION para las vistas de texto de varias líneas.

Tenga en cuenta que TextView configurará automáticamente esta bandera para usted en vistas de texto de varias líneas.

Mi solución es EditText subclase EditText y ajustar las opciones de IME luego de dejar que la plataforma las configure:

 @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; } 

En lo anterior, IME_ACTION_DONE también, aunque eso se puede lograr a través de una tediosa configuración de diseño.

La respuesta de Ohhorob es básicamente correcta, ¡pero su código realmente es realmente redundante! Es básicamente 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 opciones inputType como textShortMessage hacen que esto no funcione. Sugiero que comiences con inputType="text" . Así es cómo podría usarlo en su XML.

  

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 funciona para mí 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.

Siguiente 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; } } 

Use esto como

  

para poner la acción Hecho, podrías usar:

XML

 android:inputType="text|textCapSentences" 

JAVA

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

Espero que sea un trabajo para ti.

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 el EditText multilínea. Quieren la tecla Intro para agregar líneas nuevas y probablemente esperan que usted proporcione un botón u otro medio de entrada para plantear el evento que ha terminado de editar.

Tengo el mismo problema y mi solución obvia fue simplemente agregar un botón hecho y dejar que el botón de ingresar agregue las nuevas líneas.

Use estos atributos en su XML.

android: inputType = “textImeMultiLine”

android: imeOptions = “actionDone”