Comment gérer le bouton de retour en activité

136

Comment gérer un bouton retour dans une activité? J'ai quelques boutons. Si je clique sur l'un des boutons, il redirige vers les boutons dont j'avais besoin. Cela fonctionne bien, mais lorsque j'appuie sur le bouton de retour, cela se termine.

Comment résoudre ce problème. Je n'ai qu'une seule activité pour tous ces boutons. Merci d'avance.

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

J'ai utilisé le code ci-dessus pour gérer le bouton de retour mais cela ne fonctionne pas. Lorsque j'appuie sur le bouton de retour, il y est frappé.

Shekhar
la source

Réponses:

326

Vous pouvez le gérer comme ceci:

pour API niveau 5 et supérieur

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

plus ancien que l'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
la source
6
Qu'en est-il en fragments?
crushman
1
Oui, est-ce que quelqu'un sait comment le faire à partir d'un fragment
James Wierzba
3
@ james-wierzba gérer l'activité et déléguer le traitement à un fragment
Grigorii Chudnov
19

En plus de ce qui précède, je recommande personnellement

onKeyUp():

Le keydown parlant par programmation se déclenchera lorsque l'utilisateur enfonce une touche au départ, mais il se répétera pendant que l'utilisateur maintient la touche enfoncée. *

Cela reste vrai pour toutes les plateformes de développement.

Le développement de Google a suggéré que si vous interceptez le bouton RETOUR dans une vue, vous devez suivre l'événement KeyEvent avec starttracking sur keydown, puis appeler avec 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);
}
Sites Richard
la source
15

Pour le bouton retour du périphérique matériel et le bouton d'accueil (retour) logiciel, par exemple "<-", c'est ce qui fonctionne pour moi. (* Remarque j'ai une barre d'application / barre d'outils dans l'activité)

@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();

}

À votre santé!

S Bruce
la source
J'ai utilisé la finition et cela ne revient pas à l'activité précédente.
Si8
2
"finish ()" ferme uniquement votre activité actuelle. Vous devez gérer le retour à votre activité précédente en utilisant l'intention. Btw, votre activité précédente devrait toujours être ouverte si vous ne l'avez pas "terminée ()" lors de la navigation précédente.
S bruce
Je teste quelque chose et je vais vous mettre à jour. Merci pour la réponse.
Si8
1
Utilisez simplement super.onBackPressed () au lieu de finish ()
b00n12
9

Une approche plus simple consiste à capturer la pression du bouton Retour et à appeler moveTaskToBack (true) comme suit:

@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 a introduit une nouvelle méthode onBackPressed et ces recommandations sur la façon de gérer le bouton Retour

Umesh K
la source
9

Tu devrais utiliser:

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

Tel que défini ici: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

Si vous utilisez une ancienne version pour compiler le code, remplacez android.os.Build.VERSION_CODES.ECLAIR par 5 (vous pouvez ajouter un int privé nommé ECLAIR par exemple)

Neteinstein
la source
1

Cela m'a aidé.

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

OU????? même vous pouvez également l'utiliser pour basculer le tiroir

@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();

}

J'espère que cela vous aidera .. :)

Shubham
la source
1

C'est une manière simple de faire quelque chose.

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

Je pense qu'il y a peut-être des façons plus élaborées de procéder, mais j'aime la simplicité. Par exemple, j'ai utilisé le modèle ci-dessus pour que l'utilisateur se déconnecte de l'application ET PUIS revienne à une autre activité de mon choix.

Eddie Towers
la source