2011-02-07 6 views
13

Tengo una actividad, donde quiero que el teclado de software se abra por completo. ¿Cómo cerrar la actividad después de presionar ATRÁS, cuando se abre el teclado? Ahora tengo que hacer clic en ATRÁS dos veces, primero para cerrar el teclado y luego para terminar la Actividad.Cómo cerrar la actividad con el teclado del software después de presionar ATRÁS?

+0

good questin también estoy interesado en tu respuesta ..... upvoted y starred ..... –

+0

Esto parece un duplicado de esta pregunta: [http://stackoverflow.com/questions/3940127/intercept- back-button-from-soft-keyboard] (http://stackoverflow.com/questions/3940127/intercept-back-button-from-soft-keyboard) –

Respuesta

0

Usted puede utilizar el siguiente

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

Desafortunadamente, esto no está funcionando. onKeyUp() no se llama cuando el teclado está abierto. – fhucho

0
@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 decir u una cosa que tiene que poner otro esfuerzo para detectar que el teclado está abierto y que la bandera de uso que se puede utilizar para decidir si volver o actividad acabado

+0

Gracias, pero onKeyDown no se invoca cuando el teclado está abierto. – fhucho

3

uso onKeyPreIme (int keyCode, evento KeyEvent) método y comprobar si hay KeyEvent.K EYCODE_BACK evento. Es muy simple sin hacer ningún código de fantasía.

0

establecer un OnEditorActionListener para la EditarTexto en la actividad para la que está proporcionando el teclado en pantalla como la de abajo,

 editText.setOnEditorActionListener(new OnEditorActionListener() { 

     public boolean onEditorAction(TextView v, int actionId, 
       KeyEvent event) { 
      if (event != null 
        && (event.getKeyCode() == KeyEvent.KEYCODE_BACK)) { 
       finish(); 
      } 
      return false; 
     } 
    }); 
6

Como se ha mencionado, onKeyPreIme se puede utilizar para atrapar el botón de retroceso, pero esto tiene que ser anulado en la vista de texto, no en la actividad.

Aquí es una solución completa:

En primer lugar una nueva clase que deriva de EditarTexto, anula onKeyPreIme y pide 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, actualizar 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; 
    } 
}); 
1

No creo que necesite el oyente, setOnBackButtonListener, como se sugirió por primera vez.

Tengo que funcione mediante el uso de 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 'maneja', Voy a devolver verdadero y no falso como nuevo primer sugiere en las respuestas anteriores.

Cuestiones relacionadas