web-dev-qa-db-fra.com

Comment fermer l'activité et revenir à l'activité précédente dans Android

J'ai une activité principale, que lorsque je clique sur un bouton, commence une nouvelle activité, j'ai utilisé le code suivant pour le faire:

Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);

Le code ci-dessus a été exécuté à partir de l'activité principale.

Maintenant, dans ma nouvelle activité appelée activité principale, j'ai un bouton Précédent . Lorsque je clique sur ce bouton Précédent, je veux que ma nouvelle activité se ferme et qu'elle doit revenir à l'activité principale d'origine.

J'ai essayé d'appeler super.finish() et juste finish() (à partir de la nouvelle activité), mais cela ferme alors toute mon application (y compris mon activité principale).

Comment puis-je simplement fermer l'activité qui est actuellement mise au point, puis revenir à l'activité principale?

ÉDITÉ

Le fait que le bouton de retour de mon téléphone ferme également l'ensemble de l'application m'amène à penser que j'ai démarré la deuxième activité de manière incorrecte? 


OK j'ai regardé,

J'ai créé une activité de configuration qui utilise le même code de manifeste et le même code pour démarrer l'activité.

Pour les paramètres Activité lorsque j'appuie sur le bouton Précédent, il revient à l'activité principale.

Avec l'activité mentionnée ci-dessus dans la question principale, elle quitte simplement toute mon application.

Donc, le problème ne semble pas être avec le code pour terminer l'activité, mais l'activité elle-même.

117
Zapnologica

Je pense que vous appelez la méthode finish() dans MainActivity avant de commencer SettingsActivity.

Le scénario que vous avez décrit se produira de deux manières:

NON PLUS

Vous avez défini Android:noHistory = "true" pour MainActivity dans AndroidManifest.xml, de sorte que MainActivity devient finish automatiquement en appuyant sur la touche Précédent.

OR

Avant de passer à votre 'SettingsActivity', vous avez appelé finish() dans votre MainActivity, qui le tue. Lorsque vous appuyez sur le bouton Précédent, puisqu’aucune autre activité n’est préréglée dans la pile, elle retourne à l’écran principal.

171
Ajay S

Vous pouvez revenir à l'activité précédente en appelant simplement finish () dans l'activité en cours. Notez que tout code après l'appel de finish () sera exécuté - vous pouvez simplement faire un retour après avoir appelé finish () pour résoudre ce problème. 

Si vous souhaitez renvoyer les résultats à l'activité un, vous devez disposer des éléments suivants:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Dans votre activité appelée, vous pouvez alors obtenir l’intention à partir du paramètre onCreate () ou

getIntent();

Pour remettre un résultat à l’activité un puis à l’activité deux faire

setResult(Activity.RESULT_OK, MyIntentToReturn);

Si vous n'avez pas l'intention de revenir, dites simplement

setResult(Activity.RESULT_OK);

Si l'activité a de mauvais résultats, vous pouvez utiliser Activity.RESULT_CANCELED (utilisé par défaut). Ensuite, dans l'activité un que vous faites

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Pour terminer l'activité deux, utilisez les mêmes méthodes avec finish (), telles que décrites ci-dessus, avec vos résultats déjà définis.

53
jjNford

Lorsque vous cliquez sur votre bouton, vous pouvez le faire appeler:

super.onBackPressed();
14
Zabador

si vous utilisez fragment, vous devriez utiliser 

getActivity().onBackPressed();

si vous utilisez une seule activité, vous pouvez utiliser 

finish();
8
Osama Ibrahim

Ceci ferme toute l'application:

this.finish();
4
Logar314159

Vous faites cela trop dur. Si je comprends bien ce que vous essayez de faire correctement, le bouton "Retour" intégré et Android lui-même feront tout le travail à votre place: http://developer.Android.com/guide/components/tasks-and- back-stack.html

En outre, l'implémentation d'un bouton "Précédent" personnalisé enfreint les consignes de sécurité de l'application de base UX-N1: http://developer.Android.com/distribute/googleplay/quality/core.html

4
peejaybee
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});
4
KEYSAN

Je pense que votre deuxième activité n’est probablement pas liée à votre activité principale en tant qu’activité pour enfants. Vérifiez votre fichier AndroidManifest.xml et voyez si l'entrée <activity> de votre activité enfant contient un attribut Android:parentActivityName. Ça devrait ressembler a quelque chose comme ca:

<?xml ...?>
...
<activity
    Android:name=".MainActivity"
    ...>
</activity>
<activity
    Android:name=".ChildActivity"
    Android:parentActivityName=".MainActivity"
    ...>
</activity>
...
2
Trevor

Je ne sais pas si c'est utile ou non, mais je me débattais avec le même problème et j'ai trouvé un moyen assez simple, avec seulement une variable booléenne globale et une action onResume (). Dans mon cas, si mon activité C est cliquée sur un bouton spécifique, elle devrait déclencher la fin () de l'activité B!

Activité_A -> Activité_B -> Activité_C

Activity_A (ouvre normalement Activity_B)

Activity_B (un clic sur un bouton ouvre Activity_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Ainsi, chaque fois que je clique sur le bouton de l'activité C, il remplit la fonction "onResume ()" de l'activité B et retourne à l'activité A.

1
user2742861

N'appelez simplement pas finish() sur votre MainActivity, cela éliminera le besoin de remplacer votre onBackPressed() dans votre SecondActivity à moins que vous ne fassiez autre chose dans cette fonction. Si vous sentez le "besoin" de ce bouton de retour, vous pouvez simplement appeler finish() sur le SecondActivity et cela vous mènera à votre MainActivity tant que vous n’avez pas appelé finish() dessus.

1
codeMagic
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if ( id == Android.R.id.home ) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

Essayez ceci fonctionne à la fois sur bouton retour de la barre d’outils comme bouton retour matériel .

1
Puni

Terminer ferme toute l’application, c’est quelque chose que je déteste dans le développement d’Android et qui n’a pas besoin de terminer, c’est bien, mais qu’ils ne suivent pas la syntaxe correcte dont ils disposent. 

startActivity(intent)

Pourquoi pas 

closeActivity (intention) ?

0
Kent Hansen

il est possible que vous appeliez finish (); dans l'événement de bouton clic de sorte que l'activité principale soit fermée juste après que vous ayez cliqué sur le bouton et lorsque vous revenez de l'activité suivante, l'application est fermée, car l'activité principale est déjà fermée et aucune activité n'est active.

0
raman rayat

Nous avons rencontré une situation très similaire.

Activité 1 (Ouverture) -> Activité 2 (Aperçu) -> Activité 3 (Détail)

Réponse incorrecte "au dos de la presse" 

  • Appuyez de nouveau sur l’activité 3 pour fermer l’activité 2.

J'ai vérifié toutes les réponses affichées ci-dessus et aucune d'entre elles n'a fonctionné. La syntaxe Java pour la transition entre les activités 2 et 3 a été révisée pour être correcte.

Frais de codage sur appeler une application tierce. par une activité. Nous avons décidé d'étudier l'angle de configuration, ce qui nous a finalement permis d'identifier la cause première du problème.

Portée : Configuration de l'activité 2 (appelant).

Cause première :

Android:launchMode="singleInstance"

Solution :

Android:launchMode="singleTask"

Apparemment, sur cette question "on Back Press" singleInstance considère les activités invoquées dans une instance avec l'activité appelante, alors que singleTask autorisera les activités invoquées ayant leur propre identité suffisamment pour que le dos pressé puisse fonctionner travailler comme il se doit. 

0
Raven
{ getApplicationContext.finish();   }

Essayez cette méthode .. 

0
Abhishek

sur la méthode onCreate de votre activité, écrivez le code suivant.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Ensuite, remplacez la méthode sélectionnée par votre activité onOptionsItem comme suit

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case Android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

Et vous êtes prêt à partir.

0
Hagos Alema