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.

  • Cómo obtener ClassNotFoundException al cargar la aplicación de Android
  • Android: ¿Es posible usar string / enum en el selector drawable?
  • Desactivar la fusión de manifiesto en Android Gradle Build
  • JSON `date (...)` a `java.Util.Date` usando` org.json`
  • Mono para iOS / Android ¿Abierto o cerrado? ¿Pago o gratis?
  • Inicie el navegador predeterminado desde el navegador de portal cautivo de Android (CaptivePortalLogin)
  • 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

  • Texto que no se muestra en la superposición de MapView
  • Utilizar MediaCodec para H264 streaming
  • No se puede construir el proyecto para iOS desde cordova cli
  • ¿Cómo proporcionar animación al llamar a otra actividad en Android?
  • Cambios de código no reflejados en .apk
  • No se puede obtener backspace para trabajar en codemirror, bajo Phonegap en Android 4.x?
  • 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.