J'apprends à utiliser des fragments. J'ai trois instances de Fragmentqui sont initialisées en haut de la classe. J'ajoute le fragment à une activité comme celle-ci:
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 fonctionnent correctement. Chaque fragment est attaché à l'activité et est enregistré sans problème dans la pile arrière.
Donc, quand je lance A, Cet puis B, la pile ressemble à ceci:
| |
|B|
|C|
|A|
___
Et lorsque j'appuie sur le bouton «retour», il Best détruit et Creprend.
Mais, lorsque je lance fragment Aune deuxième fois, au lieu de reprendre à partir de la pile arrière, il est ajouté en haut de la pile arrière
| |
|A|
|C|
|A|
___
Mais je veux reprendre Aet détruire tous les fragments dessus (le cas échéant). En fait, j'aime juste le comportement par défaut de la pile arrière.
Comment faire cela?
Attendu: ( Adevrait être repris et les fragments supérieurs devraient être détruits)
| |
| |
| |
|A|
___
Edit: (suggéré par A - C)
Voici mon code d'essai:
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 est que, lorsque je lance A, puis que je Bappuie sur «retour», il Best supprimé et Arepris. et en appuyant une deuxième fois sur «retour», vous devez quitter l'application. Mais il montre une fenêtre vide et je dois appuyer une troisième fois pour la fermer.
Aussi, quand je lance A, alors B, puis C, Bencore ...
Attendu:
| |
| |
|B|
|A|
___
Réel:
| |
|B|
|B|
|A|
___
Dois-je remplacer onBackPressed()par une personnalisation ou est-ce que je manque quelque chose?