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

131

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 listo. Me gustaría que el botón Listo en el teclado active el botón Enviar que tengo en mi aplicación. 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);


        }
    }

};

}
mpeerman
fuente
1
consulte este stackoverflow.com/questions/5330243/…
Nishant
Eso se refiere a la actualización del cuadro de texto.
mpeerman
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 listo.
mpeerman

Respuestas:

313

También puede usar este (configura un oyente especial para que se llame 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;
        }
    });
vladexologija
fuente
1
¿Cómo puedo configurarlo para activar el clic? Ya me he quedado sin el botón de envío public void onClick (Ver vista) {
mpeerman
3
Puede mover todo ese código a una sola función y luego llamarlo o usar performClick ()
vladexologija
66
Esto no funcionó para mí al presionar un botón HECHO, el KeyEvent siempre fue nulo ... sin embargo, el 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 de SDK de Android en este momento)
James
28

Puedes probar con IME_ACTION_DONE.

Esta acción realiza una operación "hecho" para que no se 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;
            }
        });
IntelliJ Amiya
fuente
8
Este funciona perfecto para mí. Tenga cuidado con el retorno VERDADERO. El teclado permanece visualizado. Si desea ocultar el teclado, devuelva FALSE.
Matwosk
1
Funciona como gema!
Sam
16

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
        }
    }
});
Negro romano
fuente
Cuando presiona cualquier botón, su vista genera un evento en Key, y cuando keyCode coincide con el botón derecho, hace lo que desea
Roman Black
1
botón tiene que tener el foco
Jeffrey Blattman
8

Prueba esto para Xamarin.Android (Cross Platform)

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

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

Use esto para llamar edittext.onDone {/*action*/}a su código principal. Lo mantiene más legible y mantenible

edittext.onDone { submitForm() }

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

No olvides agregar estas opciones a tu texto de edición

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

Si necesita inputType="textMultiLine"ayuda, lea esta publicación

Gibolt
fuente
4

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

En su 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 su 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;
        }
    });
Juan rojas
fuente
2

Puede implementar en escucha clave:

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

En onCreate:

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;
}
Hombre de hojalata
fuente
1

si desea atrapar el botón de ingresar del teclado para hacer su trabajo que desea hacer a través de cualquier evento, como hacer clic en el botón, puede escribir el siguiente código simple para esa vista de texto

Edittext ed= (EditText) findViewById(R.id.edit_text);

ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Do you job here which you want to done through event
    }
    return false;
}
});
Nadeem Bhat
fuente
1

Kotlin y teclado numérico

Si está utilizando el teclado numérico, debe descartar el teclado, será como:

editText.setOnEditorActionListener { v, actionId, event ->
  if (action == EditorInfo.IME_ACTION_DONE || action == EditorInfo.IME_ACTION_NEXT || action == EditorInfo.IME_ACTION_UNSPECIFIED) {
      //hide the keyboard
      val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      imm.hideSoftInputFromWindow(windowToken, 0)
      //Take action
      editValue.clearFocus()
      return true
  } else {
      return false
  }
}
Jackson Dias da Silva
fuente
0

Use esta clase en su diseño:

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

}

En xml:

<com.test.custom.ActionEditText
                android:id="@+id/postED"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="top|left"
                android:hint="@string/msg_type_message_here"
                android:imeOptions="actionSend"
                android:inputType="textMultiLine"
                android:maxLines="5"
                android:padding="5dip"
                android:scrollbarAlwaysDrawVerticalTrack="true"
                android:textColor="@color/white"
                android:textSize="20sp" />
Yogendra
fuente
0
max.setOnKeyListener(new OnKeyListener(){
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //do what you want
    }
  }
});
RkKhanpuriya
fuente
1
Comentar tu código siempre mejora la legibilidad de una respuesta ...
jAC
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta. Recuerde que está respondiendo la pregunta para los lectores en el futuro, ¡no solo la persona que pregunta ahora! Por favor, editar su respuesta a añadir una explicación, y dar una indicación de lo que se aplican limitaciones y supuestos. Tampoco hace daño mencionar por qué esta respuesta es más apropiada que otras.
Dev-iL
0

Su último texto de edición .setOnEditorActionListener llame a este método API de hit automático

Fui Call in LoginActivity en et_password

 et_Pass.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            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");
                    Log.i(Check Internet," and Connect To Server");

                }
                return false;
            }
        });

Funcionando bien

Keshav Gera
fuente
0

Y esta es una versión de Kotlin:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
iluxa.b
fuente