Comment fermer l'activité et revenir à l'activité précédente dans android
J'ai une activité principale, que quand je clique sur un bouton, démarre 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é qui est appelée par l'activité principale, j'ai un bouton de retour. Lorsque je clique sur ce bouton de retour, je veux que ma nouvelle activité se ferme et elle doit revenir à l'activité principale d'origine.
J'ai essayé d'appeler super.finish()
et juste finish()
(à partir de la nouvelle activité), mais cette ferme toute mon application (y compris mon activité principale).
Comment puis-je simplement fermer l'activité actuellement mise au point, puis revenir à l'activité principale?
ÉDITÉ
Le fait que le bouton de retour de mon téléphone ferme également toute mon application, m'amène à penser que j'ai mal démarré la deuxième activité?
OK, j'ai cherché,
J'ai créé une activité de paramètres qui utilise le même code manifeste et le même code pour démarrer le activité.
Pour l'activité paramètres lorsque j'appuie sur le bouton Retour, il revient à l'activité principale.
Avec l'activité mentionnée ci-dessus dans la question principale, il quitte simplement mon application entière.
, Donc le problème ne semble pas être le code pour terminer l'activité, mais l'activité elle-même.
16 réponses
Je pense que vous appelez finish()
méthode dans MainActivity
avant de commencer SettingsActivity
.
Le scénario que vous avez décrit se produira de deux façons:
Soit
, Vous avez défini android:noHistory = "true"
pour MainActivity
dans AndroidManifest.xml
, qui provoque MainActivity
à finish
automatiquement en appuyant sur la touche retour.
Ou
Avant de passer à votre "SettingsActivity", vous avez appelé finish()
votre MainActivity
, ce qui le tue. Lorsque vous appuyez sur le bouton Retour, car aucune autre activité n'est préréglée pile à pop, il retourne à l'écran principal.
Vous pouvez revenir à l'activité précédente en appelant simplement finish () dans l'activité sur laquelle vous vous trouvez. Notez que tout code après l'appel finish() sera exécuté - vous pouvez simplement faire un retour après avoir appelé finish () pour résoudre ce problème.
Si vous voulez retourner les résultats à l'activité une, vous devez:
startActivityForResults(myIntent, MY_REQUEST_CODE);
Dans votre activité appelée, Vous pouvez ensuite obtenir L'intention du paramètre onCreate () ou utilisé
getIntent();
Pour définir un résultat à l'activité one puis dans activité deux faire
setResult(Activity.RESULT_OK, MyIntentToReturn);
Si vous n'avez pas l'intention de revenir puis juste dire
setResult(Activity.RESULT_OK);
Si l'activité a de mauvais résultats, vous pouvez utiliser Activity.RESULT_CANCELED (ceci est utilisé par défaut). Ensuite, dans la première activité, 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 () comme décrit ci-dessus avec vos résultats déjà définis.
Lorsque vous cliquez sur votre bouton, vous pouvez faire appel:
super.onBackPressed();
Si vous utilisez fragment u devrait utiliser
getActivity().onBackPressed();
Si vous utilisez une seule activité, vous pouvez utiliser
finish();
Tu rends ça trop dur. Si je comprends ce que vous essayez de faire correctement, le bouton "Retour" intégré et Android lui-même feront tout le travail pour vous: http://developer.android.com/guide/components/tasks-and-back-stack.html
En outre, l'implémentation d'un bouton "Retour" personnalisé viole les directives de qualité UX-N1 de L'application principale: http://developer.android.com/distribute/googleplay/quality/core.html
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();
}
});
Je crois que votre deuxième activité n'est probablement pas liée à votre activité principale en tant qu'activité enfant. Vérifiez votre fichier AndroidManifest.xml
et voyez si l'entrée <activity>
de votre activité enfant inclut un attribut android:parentActivityName
. Cela devrait ressembler à ceci:
<?xml ...?>
...
<activity
android:name=".MainActivity"
...>
</activity>
<activity
android:name=".ChildActivity"
android:parentActivityName=".MainActivity"
...>
</activity>
...
N'appelez simplement pas finish()
sur votre MainActivity
alors cela élimine le besoin de remplacer votre onBackPressed()
dans votre SecondActivity
sauf si vous faites d'autres choses dans cette fonction. Si vous vous sentez le "besoin" de ce bouton de retour, alors vous pouvez simplement appeler finish()
sur SecondActivity
et qui vous mènera à votre MainActivity
tant que vous n'avez pas appelé finish()
sur il
Je ne sais pas si c'est même utile ou non mais je me pavanais avec le même problème et j'ai trouvé un moyen assez facile, avec seulement une variable booléenne globale et une action onResume (). Dans mon cas, mon activité C si vous cliquez sur un bouton spécifique, cela devrait déclencher la finish () de L'activité B!
Activity_A - > Activity_B - > Activity_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();
}
}
Donc, chaque fois que je clique sur le bouton sur L'activité C il ferait la fonction" onResume () " de L'activité B et retournerait à L'activité A.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if ( id == android.R.id.home ) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
Essayez cela, il travaille à la fois sur barre d'outils bouton de retour, comme bouton de retour.
Il est possible que vous appeliez finish(); dans l'événement click button, l'activité principale est fermée juste après avoir cliqué sur le bouton et lorsque vous revenez de l'activité suivante, l'application est sortie car l'activité principale est déjà fermée et il n'y a pas d'activité active.
Finish ferme toute l'application, c'est quelque chose que je déteste dans le développement Android pas fini c'est bien mais qu'ils ne suivent pas la syntaxe ok qu'ils ont
startActivity(intent)
Pourquoi pas
CloseActivity(intention) ?
Nous avons rencontré une situation très similaire.
Activité 1 (Ouverture) -> Activité 2 (Extrait) -> Activité 3 (Détail)
Réponse incorrecte de "on back press"
- retour de L'appareil appuyez sur L'activité 3 fermera également L'activité 2.
J'ai vérifié toutes les réponses postées ci-dessus et aucune d'entre elles n'a fonctionné. La syntaxe Java pour la transition entre L'activité 2 et L'activité 3 a été revue pour être correcte.
Frais de codage sur l'appel d'une 3ème partie App. par une Activité. Nous avons décidé d'étudier l'angle de configuration-nous permettant éventuellement d'identifier la cause profonde du problème.
Champ: Configuration de l'Activité 2 (l'appelant).
Cause Racine:
android:launchMode="singleInstance"
Solution:
android:launchMode="singleTask"
Apparemment sur ce problème "on back press" singleInstance considère les activités invoquées dans une instance avec l'activité appelante, alors que singleTask permettra d'invoquer Activités ayant leur propre identité assez pour que la presse arrière prévue fonctionne pour fonctionner comme il se doit.