2012-01-12 10 views
10

Si configuro SingleLine = true en un widget EditText, obtengo un control de edición de línea única que no permite que el usuario inserte retornos duros (haciendo clic en Enter moves to el siguiente campo en lugar de insertar una nueva línea). Si no configuro SingleLine = true, el usuario puede insertar retornos duros.Android EditText con word-wrap pero no retornos duros

Si configuro layout_height = "wrap_content", el control EditText crecerá verticalmente para mostrar todo el texto. Sin embargo, solo hace esto si SingleLine no está configurado en verdadero.

Entonces, mi pregunta es, ¿es posible obtener el ajuste de palabras y el cambio de tamaño vertical, sin permitir que el usuario ingrese saltos de línea? Supongo que podría atrapar la tecla Enter, pero también tendría que atrapar otras formas de obtener una allí (copiar/pegar, ¿no sabes qué más?). ¿Hay una manera simple de hacer esto con la combinación correcta de propiedades?

Prefiero la redacción de palabras donde el usuario puede ver todo el texto, en comparación con el desplazamiento horizontal de un control de edición de una sola línea, pero realmente no quiero que piensen que pueden ingresar texto de líneas múltiples (y yo no quiero tener que apoyarlo). Supongo que podría convertir retornos duros en espacios cuando guarde los datos en mi base de datos, si es necesario (la aplicación heredada a la que sincronizo estos datos en la PC no puede manejar retornos duros).

Respuesta

12

Yo también estaba buscando algo para hacer esto también. La única solución que encontré fue extender la EditarTexto de la siguiente manera:

package com.kylemilligan.test; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.inputmethod.EditorInfo; 
import android.view.inputmethod.InputConnection; 
import android.widget.EditText; 

public class NoNewlineEditText extends EditText 
{ 

    public NoNewlineEditText(Context context) { 
     super(context); 
    } 

    public NoNewlineEditText(Context context, AttributeSet attributeSet) { 
     super(context, attributeSet); 
    }  

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

Y luego, en el uso de XML como:

 <com.kylemilligan.test.NoNewlineEditText 
      android:id="@+id/noNewLineText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="top|left" 
      android:imeOptions="actionDone" 
      android:minLines="5" /> 

Espero que esto ayude!

+0

tan útil. No sé por qué esto no se ofrece como un comportamiento integrado. – JulianSymes

+6

Esto funciona porque Android establece automáticamente 'EditorInfo.IME_FLAG_NO_ENTER_ACTION' en vistas de texto de líneas múltiples. Puede simplificar esto para simplemente: 'InputConnection connection = super.onCreateInputConnection (outAttrs); outAttrs.imeOptions & = ~ (EditorInfo.IME_FLAG_NO_ENTER_ACTION); conexión de retorno; ' – Foxichu

3

Estaba interesado en esto, y me di cuenta de que la aplicación de mensajería integrada de Android tiene el texto ajustado sin la tecla Intro en el teclado virtual. De acuerdo con el diseño de fuente here, se hace con las siguientes opciones. No todos son necesarios; Creo que la clave es tener textShortMessage, textMultiLine y flagNoEnterAction:

android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine" 
android:imeOptions="actionSend|flagNoEnterAction" 
+0

Esta es una solución mejor en comparación con otras que he visto. – bond

+0

Casi. No pude usar esta solución porque no parece permitirme usar 'actionDone'. No quiero emojis, ni nada parecido; Solo quiero una acción 'hecha', y no puedo hacer que funcione con esta solución. –

0
editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 
//This will treat Enter as Done instead of new line: 
editText.setRawInputType(InputType.TYPE_CLASS_TEXT); 

And in XML: 
android:inputType="textMultiLine"