Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Multiline EditText con etiqueta de acción SoftInput realizada en 2.3

¿Hay una manera de tener un Multi-Line EditText presente y utilizar el IME Action Label "Done" en Android 2.3?

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

  • Android Confirmación de diálogo en pantalla completa y acciones desdeñosas
  • Java android: agregando una nueva línea usando TextView
  • ¿Cómo obtener RelativeLayout trabajando con la fusión y la inclusión?
  • Los desarrolladores de esta aplicación no han configurado correctamente esta aplicación para iniciar sesión en Facebook.
  • Validación de Android Email en EditText
  • ¿Cómo mantener las aplicaciones de Android siempre se registran en el estado?
  • Al configurar un EditText para varias líneas, Android 2.3 elimina la posibilidad de mostrar la acción "Done" para el teclado de Soft Input.

    He logrado alterar el comportamiento del botón Entrada de Soft Input usando un 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 compruebo el valor inputType después de cargar la vista de contenido en la actividad, aparece como:

     inputType = 0x20001 

    Cual es:

    • Class = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
    • InputType.TYPE_TEXT_FLAG_MULTI_LINE = InputType.TYPE_TEXT_FLAG_MULTI_LINE

  • ¿Cómo evitar cortar / copiar / pegar en teléfono inteligente después de puerto de rotación para aterrizar en Android4.X?
  • ¿Cómo configurar el entorno de desarrollo de Android PURELY en VIM?
  • Detectar cuando la pantalla está bloqueada
  • El botón ALLOW no funciona después de la actualización
  • Android equivalente de NSUserDefaults en iOS
  • Procedimiento exacto para agregar "jfeinstein10 / SlidingMenu" en el proyecto android
  • 6 Solutions collect form web for “Multiline EditText con etiqueta de acción SoftInput realizada en 2.3”

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

    Tenga en cuenta que TextView establecerá automáticamente este indicador para usted en vistas de texto de varias líneas.

    Mi solución es subclase EditText y ajustar las opciones de IME después de dejar que la plataforma los 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, estoy forzando a IME_ACTION_DONE también, a pesar de que se puede lograr a través de la configuración de diseño tedioso.

    Ohhorob respuesta es básicamente correcta, pero su código es realmente muy 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. Le sugiero que comience con inputType="text" . Aquí está cómo usted podría utilizarlo en su XML.

     <com.example.views.ActionEditText android:id=... android:layout_stuff=... android:imeOptions="actionDone" android:inputType="textAutoCorrect|textCapSentences|textMultiLine" android:maxLines="3" /> 

    Una solución alternativa para subclasificar la clase EditText es configurar la 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 envolvimiento suave en varias líneas, incluso si se establece una acción de IME.

    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"/> 

    Para poner la acción Hecho, usted podría utilizar:

    XML

     android:inputType="text|textCapSentences" 

    JAVA

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

    Espero que su trabajo para usted.

    Al parecer, 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 acerca de cómo utilizan el EditText multilínea. Ellos quieren que la tecla Intro agregue nuevas líneas y probablemente esperen que usted proporcione un botón u otro medio de entrada para elevar el evento que está terminando 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 entrada agregue las nuevas líneas.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.