Android Use el botón Listo en el teclado para hacer clic en el botón

5 minutos de lectura

Ok, en mi aplicación tengo un campo para que el usuario ingrese un número. Tengo el campo configurado para aceptar solo números. Cuando el usuario hace clic en el campo, aparece el teclado. En el teclado (en ICS) hay un botón hecho. Me gustaría que el botón Listo del teclado active el botón Enviar que tengo en mi solicitud. Mi código es el siguiente.

package com.michaelpeerman.probability;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;

public class ProbabilityActivity extends Activity implements OnClickListener {

private Button submit;
ProgressDialog dialog;
int increment;
Thread background;
int heads = 0;
int tails = 0;

public void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    setContentView(R.layout.main);
    submit = ((Button) findViewById(R.id.submit));
    submit.setOnClickListener(this);
}

public void onClick(View view) {
    increment = 1;
    dialog = new ProgressDialog(this);
    dialog.setCancelable(true);
    dialog.setMessage("Flipping Coin...");
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setProgress(0);
    EditText max = (EditText) findViewById(R.id.number);
    int maximum = Integer.parseInt(max.getText().toString());
    dialog.setMax(maximum);
    dialog.show();
    dialog.setOnCancelListener(new OnCancelListener(){

          public void onCancel(DialogInterface dialog) {

              background.interrupt();
              TextView result = (TextView) findViewById(R.id.result);
                result.setText("heads : " + heads + "\ntails : " + tails);


          }});


    background = new Thread(new Runnable() {
        public void run() {
            heads=0;
            tails=0;
            for (int j = 0; !Thread.interrupted() && j < dialog.getMax(); j++) {
                int i = 1 + new Random().nextInt(2);
                if (i == 1)
                    heads++;
                if (i == 2)
                    tails++;
                progressHandler.sendMessage(progressHandler.obtainMessage());
            }
        }
    });
    background.start();
}

Handler progressHandler = new Handler() {
    public void handleMessage(Message msg) {

        dialog.incrementProgressBy(increment);
        if (dialog.getProgress() == dialog.getMax()) {
            dialog.dismiss();
            TextView result = (TextView) findViewById(R.id.result);
            result.setText("heads : " + heads + "\ntails : " + tails);


        }
    }

};

}

  • consulte este stackoverflow.com/questions/5330243/…

    – Nishant

    7 de marzo de 2012 a las 4:55

  • Eso se refiere a la actualización del cuadro de texto.

    – hombre de negocios

    7 de marzo de 2012 a las 5:03

  • Lo que quiero hacer es que también active un botón que ya tengo. No quiero deshacerme del botón porque algunas personas pueden estar usando teclados que no tienen un botón de listo.

    – hombre de negocios

    7 de marzo de 2012 a las 5:03

  • posible duplicado de Android detecta la pulsación de tecla Done para OnScreen Keyboard

    – Elltz

    15/04/2015 a las 18:31

avatar de usuario
vladexologija

También puede usar este (establece que se llame a un oyente especial cuando se realiza una acción en EditText), funciona tanto para DONE como para RETURN:

max.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
                Log.i(TAG,"Enter pressed");
            }    
            return false;
        }
    });

  • ¿Cómo puedo configurarlo para que active el clic en el que ya me estoy quedando sin el botón de envío public void onClick (Ver vista) {

    – hombre de negocios

    7 de marzo de 2012 a las 15:19

  • Puede mover todo ese código a una sola función y luego llamarlo o usar realizarClick()

    – vladexologija

    8 de marzo de 2012 a las 10:07

  • Esto no funcionó para mí cuando presioné un botón HECHO, KeyEvent siempre fue nulo … sin embargo, actionId se configuró en EditorInfo.IME_ACTION_DONE y pude usar eso en su lugar. (Esto está en Android 4.2.2 y ni siquiera coincide con la documentación del SDK de Android en este momento)

    – Jaime

    1 de mayo de 2014 a las 1:20


avatar de usuario
IntelliJ Amiya

Puedes probar con IME_ACTION_DONE .

Esta acción realiza una operación “hecha” para que no ingrese nada y el IME se cerrará.

 Your_EditTextObj.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                  /* Write your logic here that will be executed when user taps next button */


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

  • Este me funciona perfecto. Tenga cuidado con el retorno VERDADERO. El teclado permanece en pantalla. Si desea ocultar el teclado, devuelva FALSO.

    – Matwosk

    23/02/2016 a las 23:35

  • ¡Funciona como una joya!

    – Sam

    28 de mayo de 2019 a las 14:44

avatar de usuario
Gibolt

Solución Kotlin

La forma básica de manejar la acción realizada en Kotlin es:

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Call your code here
        true
    }
    false
}

Extensión Kotlin

Usa esto para llamar edittext.onDone {/*action*/} en su código principal. Lo mantiene más legible y fácil de mantener.

edittext.onDone { submitForm() }

fun EditText.onDone(callback: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

No olvide agregar estas opciones a su edittext

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Si necesitas inputType="textMultiLine" apoyo, lea esta publicación

  • Este oyente, de hecho, siempre vuelve false (Kotlin puzzler ;)), pero está bien: normalmente queremos que el teclado se cierre.

    – gmk57

    20 mayo 2021 a las 15:41

  • @ gmk57 Intente agregar un else a esa declaración if y haga que contenga el falso. Creo que siempre ve falso porque la declaración if establece un verdadero, pero luego fluye directamente al falso en la siguiente línea (fuera del if).

    – jj.

    21 de julio de 2021 a las 2:58

avatar de usuario
negro romano

Prueba esto:

max.setOnKeyListener(new OnKeyListener(){
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event){
        if(keyCode == event.KEYCODE_ENTER){
            //do what you want
        }
    }
});

avatar de usuario
Nitin V. Patil

Pruebe esto para Xamarin.Android (plataforma cruzada)

edittext.EditorAction += (object sender, TextView.EditorActionEventArgs e) {
       if (e.ActionId.Equals (global::Android.Views.InputMethods.ImeAction.Done)) {
           //TODO Something
       }
};

avatar de usuario
juan rojas

Copié el siguiente código de AndroidStudio cuando creas un LoginActivity. Yo uso los atributos ime

en tu diseño

<EditText android:id="@+id/unidades" android:layout_width="match_parent"
                    android:layout_height="wrap_content" android:hint="@string/prompt_unidades"
                    android:inputType="number" android:maxLines="1"
                    android:singleLine="true"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:enabled="true" android:focusable="true"
                    android:gravity="right"
                    android:imeActionId="@+id/cantidad"
                    android:imeActionLabel="@string/add"
                    android:imeOptions="actionUnspecified"/>

en tu actividad

editTextUnidades.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == R.id.cantidad || actionId == EditorInfo.IME_NULL) {
                addDetalle(null);
                return true;
            }
            return false;
        }
    });

avatar de usuario
Hombre de hojalata

Puede implementar en el oyente clave:

public class ProbabilityActivity extends Activity implements OnClickListener, View.OnKeyListener {

En onCrear:

max.setOnKeyListener(this);

@Override
public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //call your button method here
    }
    return true;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad