2011-05-20 26 views
59

¿Cómo hago un EditText en Android para que el usuario no pueda ingresar un texto de varias líneas, pero la pantalla sigue siendo multilínea (es decir, hay ajuste de palabras en lugar de que el texto pase a la derecha)?Prevenir la tecla enter en EditText pero mostrar el texto como multilínea

Es similar a la aplicación de SMS incorporada donde no podemos ingresar la línea nueva, pero el texto se muestra en múltiples líneas.

+9

sólo tiene que añadir androide: inputType = "textPersonName" al EditarTexto que va a parar de presionar enter – Nepster

Respuesta

43

Me subclase el widget y anular el manejo con el fin de bloquear la llave Enter evento clave:

class MyTextView extends EditText 
{ 
    ... 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     if (keyCode==KeyEvent.KEYCODE_ENTER) 
     { 
      // Just ignore the [Enter] key 
      return true; 
     } 
     // Handle all other keys in the default way 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+4

caso de esta línea: 'volver super.onKeyDown (keyCode, evento); 'estar en KeyDown o estoy imaginando? : P – necixy

+0

Typo, gracias por atrapar –

+0

Ambos trabajamos para la misma comunidad. De nada, jen. :) – necixy

5

Prueba esto:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_ENTER) 
    { 
     //Nothing 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+2

No. Esto restringe la edición a una sola línea. El OP quiere múltiples líneas; simplemente no quiere que el usuario pueda ingresar saltos de línea. –

+0

ver mi respuesta editada –

+0

OK ... lo mismo que propuse –

37

Este es un método, en el que no lo hace tiene que anular la clase EditText. Simplemente captura y reemplaza las líneas nuevas con cadenas vacías.

myEditTextObject.addTextChangedListener(new TextWatcher() { 

    public void onTextChanged(CharSequence s, int start, int before, int count) { 

    } 

    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

    public void afterTextChanged(Editable s) { 

     for(int i = s.length(); i > 0; i--) { 

      if(s.subSequence(i-1, i).toString().equals("\n")) 
       s.replace(i-1, i, ""); 
     } 

     String myTextString = s.toString(); 
    } 
}); 
+3

+1 Esto fue más útil en mi caso que la respuesta aceptada, por la sencilla razón de que puedo usarlo como una implementación predeterminada de TextWatcher, que se puede expandir por subclases (Lo cual simplemente llamaría a super.afterTextChanged (...) para retener esa comprobación de saltos de línea. Funciona! – AgentKnopf

+1

La condición for-loop debería ser 'i> 0' en lugar de' i> = 0'. When 'i == 0 ',' s.Secuencia (i-1, i) 'obtiene un' IndexOutOfBoundsException'. – TalkLittle

+1

Creo que esto arroja una excepción IndexOutOfBoundsException para el texto con una nueva línea que se copia y se pega con multip los nuevos caracteres de línea. – Chriskot

5

Estoy probando esto y parece que funciona:

EditText editText = new EditText(context); 
editText.setSingleLine(false); 
editText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT); 
+0

Awesome gracias. Establecer cualquier cosa en el XML estaba desactivando mis escuchas de clics ET ... ¡así que hacerlo de esta manera no! La tecla de retorno en el teclado cambia a un botón "Hecho". (Solo necesitaba el 'editText.setSingleLine (false);'). – Azurespot

+0

Esto depende totalmente del teclado utilizado. Muchos seguirán mostrando una tecla enter –

0

La adición de esta propiedad al EditText XML funciona para mí:

android:lines="1" 

permite que el caracteres de nueva línea de entrada de los usuarios pero el EditText no aumenta en altura.

23

Propiedad en XML

android:lines="5" 
android:inputType="textPersonName" 
+0

¡Gracias, la más simple! Aunque noté que impedía que mi oyente de clics en el ET funcionara ... entonces, en su lugar, use 'editText.setSingleLine (false);' en caso afirmativo. – Azurespot

+3

android: inputType = "textPersonName" NO funciona – axd

+0

Esto depende totalmente del teclado utilizado. Muchos seguirán mostrando una tecla enter –

0

Para una URI puede usar:

android:inputType="textUri" 
android:lines="1" 
android:maxLength="128" 

De lo contrario android:inputType="textPersonName" como se mencionó anteriormente funciona para otras EditarTexto nombre de dicho usuario, etc.

0
<EditText 
    android:id="@+id/Msg" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"    
    android:layout_marginTop="5dip" 
    android:lines="5" 
    android:selectAllOnFocus="true"    
    android:hint="Skriv meddelande...\n(max 100tkn)"/> 


EditText et = (EditText)findViewById(R.id.Msg); 
String strTmp = et.getText().toString(); 
strTmp = strTmp.replaceAll("\\n"," "); 
13

Esta funciona para mí:

<EditText 
    android:inputType="textShortMessage|textMultiLine" 
    android:minLines="3" 
    ... /> 

Se muestra un smiley en lugar de la tecla Enter.

+2

¡La mejor respuesta, funciona sin cambiar mucho el código! – Jaydeep

+2

Por experiencia, esto no funciona en todos los teclados. Un teléfono HTC que teníamos todavía mostraba la tecla Intro. – Treeline

+0

Esto depende totalmente del teclado utilizado. Muchos seguirán mostrando una tecla Intro –

1

La respuesta aceptada funcionó tan bien hasta que copié texto con saltos de línea en EditText. Así que agregué onTextContextMenuItem para monitorear la acción de pegar.

@Override 
public boolean onTextContextMenuItem(int id) { 
    boolean ret = super.onTextContextMenuItem(id); 
    switch (id) { 
     case android.R.id.paste: 
      onTextPaste(); 
      break; 
    } 
    return ret; 
} 

public void onTextPaste() { 
    if (getText() == null) 
     return; 
    String text = getText().toString(); 
    text = text.replaceAll(System.getProperty("line.separator"), " "); 
    text = text.replaceAll("\\s+", " "); 
    setText(text); 
} 
0
EditText textView = new EditText(activity); 
    ... 
    textView.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { 
      if(KeyEvent.KEYCODE_ENTER == keyEvent.getKeyCode()) { 
       return false; 
      } 
      ....... 

     } 
    }); 
3

Se puede establecer desde el XML como esto:

android:imeOptions="actionDone" 
android:inputType="text" 
android:maxLines="10" 

no se olvide android:inputType="text", si no se establece que, no funciona. No obstante, no sé por qué. Además, no olvide cambiar maxLines a su valor preferido.

+0

Esto depende totalmente del teclado utilizado. Muchos seguirán mostrando una tecla enter –

3

Basta con añadir

 android:singleLine="true" 

a su EditarTexto

+1

¡Esto está obsoleto! – Blasco73

3

La respuesta proporcionada por @Andreas Rudolph contiene un error crítico y no debe utilizarse. El código provoca un IndexOutOfBoundsException cuando pasa el texto dentro del EditText que contiene varios caracteres de nueva línea. Esto es causado por el tipo de bucle que se utiliza, el objeto Editable llamará al método afterTextChanged tan pronto como su contenido cambie (reemplazar, eliminar, insertar).

código correcto:

edittext.addTextChangedListener(new TextWatcher() { 

    public void onTextChanged(CharSequence s, int start, int before, int count) { 

    } 

    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

    public void afterTextChanged(Editable s) { 
     /* 
     * The loop is in reverse for a purpose, 
     * each replace or delete call on the Editable will cause 
     * the afterTextChanged method to be called again. 
     * Hence the return statement after the first removal. 
     * http://developer.android.com/reference/android/text/TextWatcher.html#afterTextChanged(android.text.Editable) 
     */ 
     for(int i = s.length()-1; i >= 0; i--){ 
      if(s.charAt(i) == '\n'){ 
       s.delete(i, i + 1); 
       return; 
      } 
     } 
    } 
}); 
+0

Debería haber editado la respuesta, en lugar de crear una nueva. –

+0

@RobertMartin Me lo estaba preguntando y solicité ayuda en el sitio web de Meta, me sugirieron que publicara una nueva respuesta. Porque los cambios que habría hecho entrarían en conflicto con la intención original del autor. –

+1

¡Agradable! Sin embargo, si comienza presionando la tecla Enter, todavía tendrá una nueva línea al principio (para que 'i> = 0' funcione) ^^ – Fllo

Cuestiones relacionadas