2013-02-18 4 views
0

Je rencontre des problèmes pour trouver une solution à ce problème.Accédez manuellement à la pile arrière Android

Fondamentalement, j'ai une charge d'onglets dans mon ActionBar. Lorsque chacun est touché, les fragments de l'onglet précédent sont détachés et les fragments du nouvel onglet sont ajoutés en utilisant replace (s'ils n'ont pas encore été instanciés) ou attachés (s'ils l'ont été). Je pense que j'ai obtenu cette méthode de Google et ça fonctionnait bien jusqu'à présent.

Exemple d'ajout de fragments d'un onglet:

if(tab.getText().equals(context.getString(R.string.title_class_tab))) {   
     if(browser == null) { 
      browser = CourseBrowserFragment.newInstance(false); 
      fragmentTransaction.replace(leftContainerId, browser); 
     } else { 
      fragmentTransaction.attach(browser); 
     } 

     if(lessonViewer == null) { 
      lessonViewer = LessonViewerFragment.newInstance(false); 
      fragmentTransaction.replace(rightContainerId, lessonViewer); 
     } else { 
      fragmentTransaction.attach(lessonViewer); 
     } 
} 

et la suppression:

if(tab.getText().equals(context.getString(R.string.title_class_tab))) {   
     if(browser != null) { 
      fragmentTransaction.detach(browser); 
     } 
     if(lessonViewer != null) { 
      fragmentTransaction.detach(lessonViewer); 
     } 
} 

Le problème provient de la mise en page que j'ai besoin pour l'un des onglets. Fondamentalement, c'est comme l'application Gmail. Il y a deux fragments (disons Panneau A et Panneau B) et quand vous appuyez sur un bouton, le Panneau A glisse, le Panneau B glisse vers l'ancienne position du Panneau A et un nouveau, le troisième (Panneau C) glisse de la droite. J'ai eu ce travail bien mais maintenant j'ai ajouté le FragmentTransaction coulissant à la pile arrière de sorte que l'utilisateur puisse toucher le bouton arrière et le panneau C va glisser vers l'arrière et le panneau A reviendra. Encore une fois, comme Gmail.

Sauf lorsque l'utilisateur accède à un autre onglet, cette transaction est toujours dans la pile arrière et s'exécute si l'utilisateur appuie de nouveau. Les fragments finissent dans des endroits fous. Ce que je dois faire est de le retirer de la pile arrière lorsque l'utilisateur navigue vers un autre onglet. Y a-t-il un moyen de le faire? FragmentManager ne semble pas vous permettre de retirer manuellement des choses de la pile arrière et l'utilisation de la méthode popBackStack() ne supprime pas simplement la transaction, mais l'exécute. Je veux l'enlever quand l'utilisateur navigue loin et le remet quand l'utilisateur revient.

Je pense que je peux me procurer le "Back Stack Entry" pour cette transaction en utilisant "getBackStackEntryAt" mais ce n'est pas très bien si je ne peux pas l'enlever et le remettre en place lorsque l'utilisateur revient à la languette.

La seule solution que je puisse penser est de ne pas utiliser la pile arrière et de passer outre onBackButtonPressed. De là, je pourrais faire un revers de la transaction si nécessaire.

Merci pour toute aide et désolé si je suis incohérent.

Répondre

0

Je ne sais pas si cela serait considéré comme une solution, mais j'ai fini par ne pas ajouter la transaction à la pile arrière et juste faire une nouvelle transaction lorsque l'utilisateur a glissé ou pressé. La transaction a simplement fait l'inverse de celle d'origine avec des animations, etc.

La façon dont j'ai géré le bouton de retour est que j'ai mis un booléen à vrai si j'étais dans la disposition montrant le panneau C. Si l'utilisateur retourne dans le panneau Une mise en page ou quitte le booléen est définie sur false. J'ai ensuite surpassé la méthode onBackButtonPressed dans l'activité et si le booléen était vrai (ie: nous sommes dans la disposition Panel C) J'exécute la transaction inverse sinon j'appelle juste super.onBackButtonPressed() (ie: effectuer le comportement du bouton standard arrière) .

Questions connexes