J'ai 2 activités (A et B) dans mon application Android et j'utilise une intention pour passer de l'activité A à l'activité B. L'utilisation de parent_activity est activée:
<activity
android:name=".B"
android:label="B" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
J'utilise également un thème qui fournit un bouton UP.
Ainsi, après avoir appelé l'activité, BI peut utiliser le bouton UP pour revenir à l'activité A. Le problème est que l'application semble appeler à nouveau la fonction onCreate () de l'activité A et ce n'est pas le comportement dont j'ai besoin. J'ai besoin que l'activité A ressemble à ce qu'elle était avant d'appeler l'activité B.
Y a-t-il un moyen d'y parvenir?
Merci d'avance
ÉDITER:
Je n'ai écrit aucun code pour démarrer l'activité B à partir de l'activité A. Je pense qu'elle est générée automatiquement par eclipse.
La classe B ressemble à:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Réponses:
Vous avez déclaré l'activité A avec la norme
launchMode
dans le manifeste Android. Selon la documentation , cela signifie ce qui suit:Par conséquent, le système est obligé de recréer l'activité A (c'est-à-dire l'appel
onCreate
) même si la pile de tâches est gérée correctement.Pour résoudre ce problème, vous devez modifier le manifeste, en ajoutant l'attribut suivant à la déclaration d'activité A:
Remarque: l' appel
finish()
(comme suggéré comme solution précédemment) ne fonctionne que lorsque vous êtes complètement sûr que l'instance d'activité B à laquelle vous mettez fin réside au-dessus d'une instance de l'activité A. Dans des flux de travail plus complexes (par exemple, lancer l'activité B à partir d'une notification) cela peut ne pas être le cas et vous devez lancer correctement l'activité A à partir de B.la source
navigateUpFromSameTask(...)
devrait ajouterFLAG_ACTIVITY_CLEAR_TOP
àupIntent
(vianavigateUpTo(...)
ce qui devrait entraîner le même comportement (selon ce guide ), mais le drapeau n'est jamais défini - et donc cette réponse a du sensRéponse mise à jour: conception de la navigation vers le haut
Vous devez déclarer quelle activité est le parent approprié pour chaque activité. Cela permet au système de faciliter les modèles de navigation tels que Up car le système peut déterminer l'activité parent logique à partir du fichier manifeste.
Donc pour cela vous devez déclarer votre activité parente dans la balise Activité avec attribut
android:parentActivityName
Comme,
Avec l'activité parent déclarée de cette façon, vous pouvez naviguer vers le parent approprié comme ci-dessous,
Ainsi, lorsque vous appelez
NavUtils.navigateUpFromSameTask(this);
cette méthode, elle termine l'activité en cours et démarre (ou reprend) l'activité parent appropriée. Si l'activité parent cible se trouve dans la pile arrière de la tâche, elle est avancée comme défini parFLAG_ACTIVITY_CLEAR_TOP
.Et pour afficher le bouton Haut, vous devez déclarer
setDisplayHomeAsUpEnabled():
Ancienne réponse: (sans navigation vers le haut, navigation arrière par défaut)
Cela ne se produit que si vous recommencez l'activité A à partir de l'activité B.
Utilisation
startActivity()
.Au lieu de cela, à partir de l'activité A, démarrez l'activité B en utilisant
startActivityForResult()
et remplacez-laonActivtyResult()
dans l'activité A.Maintenant, dans l'activité B, appelez simplement
finish()
le bouton Up. Alors maintenant, vous êtes dirigé vers l'activité AonActivityResult()
sans créer à nouveau l'activité A.la source
NavUtils.navigateUpFromSameTask(this);
écrire en ligne de codefinish()
.finish()
oustartActivityForResult()
dans sa documentation sur la navigation ( developer.android.com/design/patterns/navigation.html )?J'avais à peu près la même configuration conduisant au même comportement indésirable. Pour moi, cela a fonctionné: ajouter l'attribut suivant à une activité A dans le
Manifest.xml
de mon application:Consultez cet article pour plus d'explications.
la source
Bien qu'il s'agisse d'une vieille question, voici une autre solution (à mon avis la plus propre et la meilleure) car toutes les réponses précédentes n'ont pas fonctionné pour moi depuis que j'ai intégré l'activité B à partir d'un widget .
[ https://stackoverflow.com/a/31350642/570168 ]
Mais voir aussi: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
la source
Une meilleure façon d'y parvenir est d'utiliser deux choses: appelez:
Maintenant, pour que cela fonctionne, vous devez avoir votre fichier manifeste indiquant que l'activité A a une activité parente B. L'activité parente n'a besoin de rien. Dans la version 4 et au-dessus, vous obtiendrez une belle flèche de retour sans effort supplémentaire (cela peut également être fait sur les versions inférieures avec un peu de code, je vais le mettre ci-dessous) Vous pouvez définir ces données dans l'onglet manifest-> application dans l'interface graphique (faites défiler jusqu'au nom de l'activité parent et mettez-le à la main)
Nœud de support:
si vous souhaitez prendre en charge la version inférieure à la version 4, vous devez également inclure des métadonnées. faites un clic droit sur l'activité, ajoutez-> métadonnées, nom = android.support.PARENT_ACTIVITY et value = your.full.activity.name
pour obtenir également la belle flèche dans les versions inférieures:
veuillez noter que vous aurez besoin de la version 7 de la bibliothèque de support pour que tout fonctionne, mais cela en vaut la peine!
la source
Ce qui a fonctionné pour moi, c'est d'ajouter:
à
TheRelevantActivity.java
et maintenant il fonctionne comme prévuet ouais n'oubliez pas d'ajouter:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
dans laonCreate()
méthodela source
J'ai essayé
android:launchMode="singleTask"
, mais cela n'a pas aidé. A travaillé pour moi en utilisantandroid:launchMode="singleInstance"
la source
Ajouter à la réponse de @ LorenCK, changer
au code ci-dessous si votre activité peut être initiée à partir d'une autre activité et que cela peut faire partie d'une tâche démarrée par une autre application
Cela lancera une nouvelle tâche et démarrera l'activité parent de votre activité que vous pouvez définir dans le manifeste comme ci-dessous de la version Min SDK <= 15
Ou en utilisant
parentActivityName
si son> 15la source
parentActivityName
pour SDK> 15 sinon cela vous donnera des plantages aléatoiresJ'ai eu un problème similaire en utilisant Android 5.0 avec un nom d'activité parent incorrect
J'ai supprimé com.example.myfirstapp du nom de l'activité parent et cela a fonctionné correctement
la source
Ajoutez à votre activité des informations de manifeste avec l'attribut
fonctionne bien pour moi
la source
En classe Java: -
Dans le manifeste: -
Cela vous aidera
la source
comme une presse arrière
la source
essaye ça:
la source
Aller dans mon manifeste et ajouter
android:launchMode="singleTop"
à l'activité a fait l'affaire pour moi.Cela a spécifiquement résolu mon problème car je ne voulais pas qu'Android crée une nouvelle instance de l'activité précédente après avoir frappé le
Up
bouton dans la barre d'outils - je voulais plutôt utiliser l'instance existante de l'activité précédente lorsque je suis monté dans la hiérarchie de navigation.Référence: android: launchMode
la source
Essayez cette solution, utilisez NavUtils.navigateUpFromSameTask (this); dans l'activité enfant: https://stackoverflow.com/a/49980835/7308789
la source