web-dev-qa-db-fra.com

Navigation Android pour une activité avec plusieurs parents

J'ai un problème pour implémenter up navigation sur une application avec cet arbre de navigation:

App navigation tree

L'implémentation standard du bouton de retour est correcte.

Le problème commence lorsque vous essayez d'implémenter le bouton Haut.

Ce que j'attends

  • lorsque l'utilisateur est sur Detail 5 Activity et que vous appuyez sur le bouton haut de l'application, l'application passe à List 3 Activity
  • lorsque l'utilisateur est sur Detail 7 Activity et que vous appuyez sur le bouton haut de l'application, l'application retourne à Home Activity

Donc, dans des termes différents, j'aimerais avoir ce comportement sur la pile arrière:

app backstack clear

La documentation Android ( Implementing Ancestral Navigation ) conseille d’utiliser le code suivant pour gérer la navigation up:

Intent parentActivityIntent = new Intent(this, MyParentActivity.class);
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();

Mais comme l’activité parente de Detail Activity diffère d’un chemin de navigation à un autre, je ne sais pas lequel il s’agit. Donc, je ne peux pas l'appeler dans l'intention.

Existe-t-il un moyen de connaître l'activité réelle des parents dans la pile arrière d'Android?

Sinon, y a-t-il un moyen d'implémenter une navigation correcte dans cette application?

37
ol_v_er

Je vais m'en tenir à mon commentaire sur la réponse de Paul:

L'idée est de disposer d'une pile de la dernière Parent Activités traversées. Exemple:

public static Stack<Class<?>> parents = new Stack<Class<?>>();

Maintenant, dans toutes vos activités parentales (les activités considérées comme des parents, par exemple dans votre cas: Liste et Accueil), vous ajoutez ceci à leur onCreate:

protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     parents.Push(getClass()); 
     //or better yet parents.Push(getIntent()); as @jpardogo pointed
     //of course change the other codes to make use of the Intent saved.

     //... rest of your code
}

Lorsque vous souhaitez revenir à l'activité Parent, vous pouvez utiliser les éléments suivants (en fonction de votre code):

Intent parentActivityIntent = new Intent(this, parents.pop());
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();

J'espère avoir raison (:

22
Sherif elKhatib

C'est une question délicate et, à mon avis, montre bien les difficultés à faire face aux décisions UX d'Android pour le "bouton". Par conséquent, il n'y a pas de réponse claire à votre problème.

J'ai deux solutions possibles pour vous.

1. Imiter le comportement du bouton de retour.

Vous pouvez envisager d'ajouter un élément supplémentaire à l'intention de lancer Detail à partir de l'un de ses différents parents. Cet extra informerait les activités qu’elles auraient besoin de lancer lorsque Android.R.id.home est pressé.

Cela signifierait effectivement que votre application "reviendra" à son ancêtre commun, au lieu de simplement relancer Home.

Une autre façon d'implémenter ceci peut être simplement d'exécuter onBackPressed() au lieu de lancer Home avec Intent.FLAG_ACTIVITY_CLEAR_TOP, mais gardez à l'esprit que l'animation associée serait différente d'une action "up" normale.

2. Sautez les activités intermédiaires et rentrez chez vous.

Certaines applications traitent le "bouton haut" comme un "bouton d'accueil". Vous voudrez peut-être envisager de simplement relancer toujours Home avec Intent.FLAG_ACTIVITY_CLEAR_TOP.

2
Paul Lammertsma

c’est certes un vieux post, mais comme j’étudiais les SharedPreferences, je pense que cela pourrait être une possibilité d’empiler ces informations dans des données sharedPreferences et de modifier leur valeur à chaque fois avant de descendre les 2 parents .. en le lisant, vous devriez être capable de connaître directement votre parent, sans avoir à construire une classe entière pour cela.

0
Alexandre