Comment reprendre un Fragment de la BackStack si il existe

Je suis en train d'apprendre comment utiliser des fragments. J'ai trois instances de Fragment qui sont initialisés à la tête de classe. Je suis l'ajout du fragment à une activité de ce genre:

De la déclaration et initialisation:

Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();

Remplacement/Ajout:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();

Ces extraits sont travail correctement. Chaque fragment est attaché à l'activité, et est enregistré dans la pile de retour sans aucun problème.

Donc quand je lance A, C, puis B, la pile ressemble à ceci:

| |
|B|
|C|
|A|
___

Et lorsque j'appuie sur le bouton "retour", B est détruit et C est repris.

Mais, lorsque je lance fragment A un deuxième temps, plutôt que de reprendre à partir de l'arrière de la pile, il est ajouté en haut de la pile de retour

| |
|A|
|C|
|A|
___

Mais je veux reprendre A et de détruire tous les fragments sur le dessus de celui-ci (le cas échéant). En fait, j'aime juste le défaut de retour de la pile de comportement.

Comment puis-je y arriver?

Attendus: (A devrait être repris et haut fragments doivent être détruits)

| |
| |
| |
|A|
___

Edit: (suggéré par Un--C)

C'est que j'essaie de code:

private void selectItem(int position) {
Fragment problemSearch = null, problemStatistics = null;
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
String backStateName = null;
Fragment fragmentName = null;
boolean fragmentPopped = false;
switch (position) {
case 0:
fragmentName = profile;
break;
case 1:
fragmentName = submissionStatistics;
break;
case 2:
fragmentName = solvedProblemLevel;
break;
case 3:
fragmentName = latestSubmissions;
break;
case 4:
fragmentName = CPExercise;
break;
case 5:
Bundle bundle = new Bundle();
bundle.putInt("problem_no", problemNo);
problemSearch = new ProblemWebView();
problemSearch.setArguments(bundle);
fragmentName = problemSearch;
break;
case 6:
fragmentName = rankList;
break;
case 7:
fragmentName = liveSubmissions;
break;
case 8:
Bundle bundles = new Bundle();
bundles.putInt("problem_no", problemNo);
problemStatistics = new ProblemStatistics();
problemStatistics.setArguments(bundles);
fragmentName = problemStatistics;
default:
break;
}
backStateName = fragmentName.getClass().getName();
fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
ft.replace(R.id.content_frame, fragmentName);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(backStateName);
ft.commit();
//I am using drawer layout
mDrawerList.setItemChecked(position, true);
setTitle(title[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}

Le problème c'est que quand je lance A et puis B, puis appuyez sur la touche 'retour', B est supprimé et A est repris. et en appuyant sur "retour", un deuxième temps de sortir de l'application. Mais il montre une fenêtre vide et je dois appuyer sur retour pour une troisième fois pour la fermer.

Aussi, lorsque je lance A, puis B, puis C, puis B encore...

Prévu:

| |
| |
|B|
|A|
___

Réel:

| |
|B|
|B|
|A|
___

Dois-je remplacer onBackPressed() avec toute personnalisation ou ai-je raté quelque chose?

InformationsquelleAutor Kaidul | 2013-08-19