Cómo manejar el botón de retroceso en la actividad

136

¿Cómo manejar un botón de retroceso en una actividad? Tengo unos botones Si hago clic en uno de los botones, se redirige a los botones que necesitaba. Está funcionando bien, pero cuando presiono el botón Atrás se termina.

Cómo resolver este problema. Solo tengo una actividad para todos esos botones. Gracias por adelantado.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    {
        return false; //I have tried here true also
    }
    return super.onKeyDown(keyCode, event);
}

He usado el código anterior para manejar el botón de retroceso, pero no funciona. Cuando presiono el botón de retroceso, golpeó allí mismo.

Shekhar
fuente

Respuestas:

326

Puedes manejarlo así:

para API nivel 5 y superior

@Override
public void onBackPressed() {
    // your code.
}

anterior a API 5

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // your code
        return true;
    }

    return super.onKeyDown(keyCode, event);
}
Saurabh Pareek
fuente
66
¿Qué pasa con los fragmentos?
Crushman
1
Sí, ¿alguien sabe cómo hacerlo desde un fragmento
James Wierzba
3
@ james-wierzba maneja la actividad y delega el procesamiento a un fragmento
Grigorii Chudnov
19

Además de lo anterior, personalmente recomiendo

onKeyUp():

Hablando programáticamente keydown se dispara cuando el usuario pulsa una tecla inicialmente , pero se va a repetir mientras el usuario mantiene pulsada la tecla. * *

Esto sigue siendo cierto para todas las plataformas de desarrollo.

El desarrollo de Google sugirió que si está interceptando el botón ATRÁS en una vista, debe rastrear KeyEvent con starttracking en keydown y luego invocar con keyup.

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

public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
            && !event.isCanceled()) {
        // *** Your Code ***
        return true;
    }
    return super.onKeyUp(keyCode, event);
}
Sitios de Richard
fuente
15

Tanto para el botón de retroceso del dispositivo de hardware como para el botón de inicio suave (atrás), por ejemplo, "<-", esto es lo que funciona para mí. (* Nota: tengo una barra de aplicaciones / barra de herramientas en la actividad)

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            //finish();
            onBackPressed();
            break;
    }
    return true;
}



@Override
public void onBackPressed() {
   //Execute your code here
   finish();

}

¡Salud!

S bruce
fuente
Solía ​​terminar y no vuelve a la actividad anterior.
Si8
2
"terminar ()" cierra su actividad actual solamente. Debe manejar volver a su actividad anterior utilizando la intención. Por cierto, su actividad anterior aún debería estar abierta si no la "finalizó ()" al navegar desde ella anteriormente.
S bruce
Estoy probando algo y te actualizaré. Gracias por la respuesta.
Si8
1
Simplemente use super.onBackPressed () en lugar de terminar ()
b00n12
9

Un enfoque más simple es capturar el botón Atrás presionar y llamar a moveTaskToBack (verdadero) de la siguiente manera:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Android 2.0 introdujo un nuevo método onBackPressed, y estas recomendaciones sobre cómo manejar el botón Atrás

Umesh K
fuente
9

Deberías usar:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
            && keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        // Take care of calling this method on earlier versions of
        // the platform where it doesn't exist.
        onBackPressed();
    }

    return super.onKeyDown(keyCode, event);
}

@Override
public void onBackPressed() {
    // This will be called either automatically for you on 2.0
    // or later, or by the code above on earlier versions of the
    // platform.
    return;
}

Como se define aquí: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

Si está utilizando una versión anterior para compilar el código, reemplace android.os.Build.VERSION_CODES.ECLAIR por 5 (puede agregar un int privado llamado ECLAIR, por ejemplo)

Neteinstein
fuente
1

Esto me ayudó ...

@Override
public void onBackPressed() {
    startActivity(new Intent(currentActivity.this, LastActivity.class));
    finish();
}

¿¿¿¿¿O????? incluso puedes usar esto para alternar cajones también

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
        startActivity(new Intent(currentActivity.this, LastActivity.class));
    finish();

}

Espero que esto te ayude .. :)

Shubham
fuente
1

Esta es una manera simple de hacer algo.

    @Override
        public void onBackPressed() {
            // do what you want to do when the "back" button is pressed.
            startActivity(new Intent(Activity.this, MainActivity.class));
            finish();
        }

Creo que podría haber formas más elaboradas de hacerlo, pero me gusta la simplicidad. Por ejemplo, utilicé la plantilla anterior para hacer que el usuario cierre sesión en la aplicación Y LUEGO vuelva a otra actividad de mi elección.

Eddie Towers
fuente