Cómo cerrar la actividad con el teclado del software después de presionar BACK?

Tengo una Actividad, donde quiero que el teclado del software se abra siempre. ¿Cómo cerrar la Actividad después de la pulsación BACK, cuando se abre el teclado? Ahora tengo que hacer clic DOS veces, primero para cerrar el teclado y luego para terminar la Actividad.

Como se mencionó, onKeyPreIme se puede utilizar para capturar el botón de retroceso, pero esto debe anularse en la vista de texto, no en la actividad.

He aquí una solución completa:

En primer lugar una nueva clase que se deriva de EditText, anula onKeyPreIme y llama a una interfaz de devolución de llamada:

// EditTextWithBackButton class public class EditTextWithBackButton extends EditText { public interface IOnBackButtonListener { boolean OnEditTextBackButton(); } public EditTextWithBackButton(Context context) { super(context); } public EditTextWithBackButton(Context context, AttributeSet attrs) { super(context, attrs); } public void setOnBackButtonListener(IOnBackButtonListener l) { _listener = l; } IOnBackButtonListener _listener; @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (event.getAction()==KeyEvent.ACTION_UP && keyCode==KeyEvent.KEYCODE_BACK) { if (_listener!=null && _listener.OnEditTextBackButton()) return false; } return super.onKeyPreIme(keyCode, event); //To change body of overridden methods use File | Settings | File Templates. } } 

A continuación, actualice su diseño:

 <com.yournamespace.whatever.EditTextWithBackButton android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/textField" /> 

A continuación, actualice su actividad, dentro de OnCreate, después de setContentView:

 ((EditTextWithBackButton) findViewById(R.id.textField)).setOnBackButtonListener(new EditTextWithBackButton.IOnBackButtonListener() { @Override public boolean OnEditTextBackButton() { finish(); return true; } }); 

Utilice el método onKeyPreIme (int keyCode, KeyEvent event) y compruebe el evento KeyEvent.KEYCODE_BACK . Es muy simple sin hacer ninguna codificación de lujo.

No creo que necesite el oyente, setOnBackButtonListener, como se ha sugerido por primera vez.

Lo tengo funcionando usando getContext ():

 public class EditedText extends EditText { @Override public boolean onKeyPreIme (int keyCode, KeyEvent event){ if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ Activity activity = (Activity) getContext(); activity.finish(); return true; } return super.onKeyPreIme(keyCode, event); } } 

Tenga en cuenta, ya que el evento fue "manejado", estoy devolviendo verdadero y no falso como otra vez sugerido por primera vez en las respuestas anteriores.

Puede utilizar los siguientes

  @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { finish(); return true; } return super.onKeyUp(keyCode, event); } 
 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { finish(); return true; } return super.onKeyDown(keyCode, event); } 

Pero te digo una cosa que tienes que poner otro esfuerzo para detectar que el teclado está abierto y que usar bandera que se puede utilizar para decidir si volver atrás o terminar la actividad

Establezca un OnEditorActionListener para el EditText en la actividad para la que está proporcionando el teclado suave como a continuación,

  editText.setOnEditorActionListener(new OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (event != null && (event.getKeyCode() == KeyEvent.KEYCODE_BACK)) { finish(); } return false; } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.