Android: maneje "Enter" en un EditText

459

Me pregunto si hay una manera de manejar al usuario presionando Entermientras escribe EditText, algo así como el evento onSubmit HTML.

También me pregunto si hay una manera de manipular el teclado virtual de tal manera que el botón "Listo" esté etiquetado como algo diferente (por ejemplo, "Ir") y realice una determinada acción al hacer clic (de nuevo, como en OnSubmit).

Felix
fuente
1
Kotlin y extensiones: eche un vistazo aquí: stackoverflow.com/a/48810268/1912924
Francesco Donzello

Respuestas:

374

Me pregunto si hay una manera de manejar al usuario presionando Entermientras escribe un EditText, algo así como el evento onSubmit HTML.

Si.

También me pregunto si hay una manera de manipular el teclado virtual de tal manera que el botón "Listo" esté etiquetado como algo diferente (por ejemplo, "Ir") y realice una determinada acción al hacer clic (de nuevo, como en OnSubmit).

También si.

Querrá ver los atributos android:imeActionIdy android:imeOptions, más el setOnEditorActionListener()método, todo activado TextView.

Para cambiar el texto del botón "Listo" a una cadena personalizada, use:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);
CommonsWare
fuente
26
(PS EditText extiende TextView, por lo tanto, las propiedades que debe observar están en TextView; cuando leí por primera vez esa última oración, hice una doble toma :))
Ricket
15
Como una nota No todos los teclados admiten el atributo estándar android: imeOptions. Lo cual es realmente decepcionante. Por ejemplo, IME_ACTION_DONE se define como 6, donde el teclado predeterminado de HTC (en teléfonos como Incredible, Evo 4G) la tecla de retorno se define como 0.
fernferret
13
Además, si utiliza imeOptions, asegúrese de utilizar inputType = "text" u otro equivalente. ¡Para asegurarte de que el teclado te escuche! Nexus1
Blundell
66
"Sí" - ¿Serías más descriptivo que esto? Probablemente preguntará cómo implementar la solución.
Al Wang
44
@AlWang: Primero, su área de preocupación está cubierta en la respuesta (vea comenzando con "Desea ..."). En segundo lugar, esta respuesta es de hace seis años , por lo que uno presumiría que el problema del OP se resolvió. Después de todo, el OP aceptó la respuesta.
CommonsWare
267
final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});
Ley Jarod DY
fuente
1
Por alguna razón, cuando hago clic enteren mi texto de edición, todo el texto de edición se mueve hacia abajo ... ¿Cómo puedo solucionar esto?
Ruchir Baronia
1
@RuchirBaronia Agregue android: maxLines = "1" a su EditText. Su EditText no se "mueve hacia abajo", sino que inserta un salto de línea en el texto ingresado. Establecer maxLines en 1 evita que se inserte el salto de línea.
lustig
3
Esta solución solo funciona para teclados de hardware, NO para el teclado virtual / virtual. Si confía en él, su aplicación se romperá para los usuarios sin teclados conectados.
user3562927
12
Sin ofender a CommonsWare, pero su respuesta RTFM fue mucho menos útil que este simple ejemplo que muestra exactamente cómo hacerlo. ¡Gracias!
AutonomousApps
1
@AutonomousApps, a menudo veo respuestas de CommonsWare. Tuvo la suerte de responder desde 2009, cuando comenzó Android. A menudo "sí", "no", "imposible", etc., generalmente sin código. A menudo sus respuestas están desactualizadas ahora, así que trato de no seguir sus recomendaciones.
CoolMind
215

Esto es lo que haces. También está oculto en el código de muestra del desarrollador de Android 'Bluetooth Chat'. Reemplace las partes en negrita que dicen "ejemplo" con sus propias variables y métodos.

Primero, importe lo que necesita en la Actividad principal donde desea que el botón de retorno haga algo especial:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

Ahora, haga una variable de tipo TextView.OnEditorActionListener para su clave de retorno (aquí uso exampleListener );

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

Luego debe decirle al oyente dos cosas sobre qué hacer cuando se presiona el botón de retorno. Necesita saber de qué EditText estamos hablando (aquí uso exampleView ), y luego necesita saber qué hacer cuando se presiona la tecla Enter (aquí, example_confirm () ). Si este es el último o único EditText en su Actividad, debería hacer lo mismo que el método onClick para su botón Enviar (u OK, Confirmar, Enviar, Guardar, etc.).

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

Finalmente, configure el oyente (muy probablemente en su método onCreate);

exampleView.setOnEditorActionListener(exampleListener);
Chad Hedgcock
fuente
20
Bien, he usado EditorInfo.IME_ACTION_SEND y tengo android: imeOptions = "actionSend" en el XML.
Bani
buscar EditorInfo.IME_ACTION_SEND no tuvo ningún efecto para mí (emulador), así que como disparador infalible también busqué KeyEvent.KEYCODE_ENTER. Ver aquí: stackoverflow.com/questions/2004344/…
Alguien en algún lugar
44
Por lo general, es mejor realizar acciones en KeyEvent.ACTION_UP. Para que esto funcione, es necesario consumir por primera vez el ACTION_DOWNevento: if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }. Luego puede verificar el ACTION_UPevento y realizar la acción (similar a la respuesta anterior). Si no consume el ACTION_DOWNevento, onEditorActionno se lo solicitará ACTION_UP.
Ashughes
2
Esto es lo que funcionó para mí: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- no podía obtener ninguno de los otros enfoques para trabajar
Jonathan Ellis
38

Los teclados de hardware siempre producen eventos de entrada, pero los teclados de software devuelven diferentes ID de acción y nulos en SingleTine EditTexts. Este código responde cada vez que el usuario presiona Intro en un EditText en el que este oyente ha sido configurado, independientemente de EditText o tipo de teclado.

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

La apariencia predeterminada de la tecla enter en singleLine = false da una flecha doblada para ingresar al teclado. Cuando singleLine = true en el último EditText la clave dice HECHO, y en EditTexts antes dice NEXT. De forma predeterminada, este comportamiento es coherente en todos los emuladores de vainilla, Android y Google. El atributo scrollHorizontal no hace ninguna diferencia. La prueba nula es importante porque la respuesta de los teléfonos a las entradas suaves se deja al fabricante e incluso en los emuladores, los emuladores de nivel 16 de vainilla responden a las entradas suaves largas en líneas múltiples y desplazamiento. el evento.

Earlcasper
fuente
Cuando actualicé Java, mi cadena de herramientas de Android se rompió. Fue de 32 bits. Reinstalé todo de 64 bits y descubrí que ahora hay muchas más versiones de emulador público disponibles. Debo admitir que solo sé que el comportamiento del EditorActionListener es consistente en los emuladores que probé.
earlcasper
Cuando publiqué esto en mi blog, alguien comentó que para que funcione en eclipse, debe cambiar la acción ime predeterminada, agregando android: imeOptions = "actionGo".
earlcasper
Vaya, leí mal el comentario en mi blog. Para que funcione en eclipse, debe cambiar la acción ime predeterminada, agregando android: imeOptions = ”actionGo”. al 'EditText' en el diseño xml.
earlcasper
En una reflexión posterior, mi último comentario se refiere tanto a Ant como a Eclipse
earlcasper
27

Esta página describe exactamente cómo hacer esto.

https://developer.android.com/training/keyboard-input/style.html

Configure android: imeOptions y luego verifique el actionId en onEditorAction. Entonces, si configura imeOptions en 'actionDone', entonces verificará 'actionId == EditorInfo.IME_ACTION_DONE' en onEditorAction. Además, asegúrese de configurar el android: inputType.

Aquí está el EditText del ejemplo vinculado anteriormente:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

También puede configurar esto mediante programación utilizando la función setImeOptions (int) . Aquí está el OnEditorActionListener del ejemplo vinculado anteriormente:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});
Miguel
fuente
21

Sé que esto tiene un año, pero acabo de descubrir que funciona perfectamente para EditText.

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

Impide todo menos texto y espacio. No pude tabular, "volver" ("\ n") ni nada.

Novato
fuente
Trabajó para mí, con la adición de IME_ACTION_DONE
htafoya
1
Funciona perfectamente bien si desea desactivar la tecla "Enter".
deeJ
16

Justo como un apéndice de la respuesta de Chad (que funcionó casi perfectamente para mí), descubrí que necesitaba agregar una verificación en el tipo de acción KeyEvent para evitar que mi código se ejecute dos veces (una vez en la tecla arriba y otra en la tecla abajo evento).

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

Consulte http://developer.android.com/reference/android/view/KeyEvent.html para obtener información sobre la repetición de eventos de acción (mantener presionada la tecla Intro), etc.

kermitology
fuente
16

Tuve un propósito similar. Quería resolver presionando la tecla "Enter" en el teclado (que quería personalizar) en un AutoCompleteTextView que extiende TextView. Intenté diferentes soluciones de arriba y parecían funcionar. PERO experimenté algunos problemas cuando cambié el tipo de entrada en mi dispositivo (Nexus 4 con AOKP ROM) de SwiftKey 3 (donde funcionó perfectamente) al teclado estándar de Android (donde en lugar de manejar mi código desde el oyente, una nueva línea era ingresó después de presionar la tecla "Enter". Me tomó un tiempo manejar este problema, pero no sé si funcionará en todas las circunstancias, sin importar el tipo de entrada que use.

Así que aquí está mi solución:

Establezca el atributo de tipo de entrada de TextView en el xml a "texto":

android:inputType="text"

Personalice la etiqueta de la tecla "Enter" en el teclado:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

Establezca un OnEditorActionListener en TextView:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

Espero que esto pueda ayudar a otros a evitar los problemas que tuve, porque casi me volvieron loco.

kaolick
fuente
Lamentablemente, esto no funciona con la nueva versión 4 de SwiftKey. Y me está volviendo loco otra vez ...: - /
kaolick
3
Su IF es incorrecto. use: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda
Perfecto para mi. Recuerde también insertar nuevamente setImeActionLabel en la instrucción IF; de lo contrario, el texto personalizado desaparecerá después de la primera pulsación.
Steve Rogers
Su IF es correcto, porque establece su actionId en KeyEvent.KEYCODE_ENTER arriba :-D, pero sí, todos los demás probablemente quieran usar event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Ray Hulha
15

En su xml, agregue el atributo imeOptions al editText

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

Luego, en su código Java, agregue OnEditorActionListener al mismo EditText

mAddItemEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE){
                //do stuff
                return true;
            }
            return false;
        }
    });

Aquí está la explicación: imeOptions = actionDone asignará "actionDone" a EnterKey. La tecla EnterKey en el teclado cambiará de "Enter" a "Done". Entonces, cuando se presiona la tecla Intro, se activará esta acción y, por lo tanto, la manejará.

ARCA
fuente
9

También puedes hacerlo ...

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });
Zar E Ahmer
fuente
Por alguna razón, cuando hago clic enteren mi texto de edición, todo el texto de edición se mueve hacia abajo ... ¿Cómo puedo solucionar esto?
Ruchir Baronia
Creo que quieres aprender stackoverflow.com/questions/10978038/… de lo contrario muéstrame tu xml
Zar E Ahmer
6
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

Funciona muy bien para mí
Además, oculta el teclado

Vlad
fuente
5

Primero, debe configurar EditText escuchar la tecla presionada

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

Segundo, defina el evento al presionar la tecla, por ejemplo, evento para establecer el texto de TextView:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

Y finalmente, no olvide importar EditText, TextView, OnKeyListener, KeyEvent en la parte superior:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;
LifeiSHot
fuente
5

trabajando perfectamente

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

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

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

trabajando perfectamente

Domi mtz
fuente
5
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

Xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />
kreker
fuente
4

Esto debería funcionar

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

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

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });
ORY
fuente
4

Escriba este código en su editor para que pueda importar los módulos necesarios.

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });
Sanjit Prasad
fuente
query = Nombre del campo EditText, y también agregue esto -> (android: imeOptions = "actionSearch") en xml de EditText.
Sanjit Prasad
3

Esto funciona bien en teléfonos LG Android. Impide que ENTERotros caracteres especiales se interpreten como caracteres normales. NextEl Donebotón o aparece automáticamente y ENTERfunciona como se esperaba.

edit.setInputType(InputType.TYPE_CLASS_TEXT);
Milan Švec
fuente
Esto es lo ÚNICO que funcionó para mí. Tengo un Motorola Moto X 2 y normalmente tiene una tecla "Volver" con la flecha y todo. Esto lo cambió a una marca de verificación y finalmente pude lograr que el oyente trabajara con eso. (Antes de que acabara de crear una nueva línea). Entonces, si alguien más tiene ese problema ...
mystic cola
2

Aquí hay una función estática simple que puede incluir en su clase Utilso Keyboardsque ejecutará el código cuando el usuario presione la tecla de retorno en un teclado de hardware o software. Es una versión modificada de la excelente respuesta de @ earlcasper

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}
JohnnyLambada
fuente
Tenga en cuenta que esto usa una expresión lambda que requiere Java 1.8, pero es bastante fácil convertirla para que no use una lambda. Sin embargo, el problema que he visto con este tipo de soluciones es que el teclado virtual no se oculta automáticamente, y si está en modo de pantalla completa (dispositivo pequeño en orientación horizontal), el modo de pantalla completa no se apaga después de que el usuario presiona Enter o DONE
jk7
2

InputType en el campo de texto debe estar texten orden para que funcione CommonsWare. Solo intenté todo esto, no inputType antes de la prueba y nada funcionó, Enter siguió registrándose como soft enter. Después inputType = text, todo, incluido el setImeLabel funcionó.

Ejemplo: android:inputType="text"

Odaym
fuente
2
   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });
Brinda Rathod
fuente
1

Una forma confiable de responder a un <enter> en un EditText es con un TextWatcher , un LocalBroadcastManager y un BroadcastReceiver . Debe agregar la biblioteca de soporte v4 para usar LocalBroadcastManager. Uso el tutorial en vogella.com : 7.3 "Eventos de transmisión local con LocalBroadcastManager" debido a su completo código conciso Ejemplo. En onTextChanged before se encuentra el índice del final del cambio antes del cambio >; menos inicio. Cuando en TextWatcher, el subproceso de la interfaz de usuario está ocupado actualizando editText editable, por lo que enviamos una intención para activar BroadcastReceiver cuando el subproceso de la interfaz de usuario termina de actualizar editText.

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here
Earlcasper
fuente
Si utiliza cualquiera de los tipos de entrada de texto * (p android:inputType="textCapSentences". Ej. ), Los retornos de carro se filtran de la entrada, por lo que onTextChanged () no se llama cuando el usuario presiona la tecla Intro.
jk7
1

Esta pregunta aún no ha sido respondida con Butterknife

DISEÑO XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

APP JAVA

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}
Alguien en alguna parte
fuente
TextInputLayout y Butterknife: ¡GANE!
Javi
1

Usando Kotlin, he creado una función que maneja todo tipo de acciones "hechas" para EditText, incluido el teclado, y es posible modificarlo y también manejar otras teclas como desee:

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

Entonces, muestra de uso:

        editText.setOnDoneListener({
            //do something
        })

En cuanto a cambiar la etiqueta, creo que depende de la aplicación del teclado, y que generalmente cambia solo en horizontal, como está escrito aquí . De todos modos, ejemplo de uso para esto:

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

O, si quieres en XML:

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

Y el resultado (mostrado en paisaje):

ingrese la descripción de la imagen aquí

desarrollador de Android
fuente
0

Agregue estos de forma independiente, y debería funcionar:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
Jacky Supit
fuente
0

Esto le dará una función invocable cuando el usuario presione la tecla de retorno.

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

Uso

editText.setLineBreakListener {
    doSomething()
}
Miguel
fuente