Ich lerne, wie man Fragmente benutzt. Ich habe drei Instanzen davon Fragment, die oben in der Klasse initialisiert werden. Ich füge das Fragment einer Aktivität wie dieser hinzu:
Deklarieren und Initialisieren:
Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();
Ersetzen / Hinzufügen:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();
Diese Schnipsel funktionieren ordnungsgemäß. Jedes Fragment ist an die Aktivität angehängt und wird problemlos im Backstack gespeichert.
Also , wenn ich starten A, Cund dann Bdie Stapel sieht wie folgt aus :
| |
|B|
|C|
|A|
___
Und wenn ich den 'Zurück'-Knopf drücke, Bwird zerstört und Cwieder aufgenommen.
Wenn ich das Fragment jedoch Aein zweites Mal starte, anstatt es vom Backstack fortzusetzen, wird es oben im Backstack hinzugefügt
| |
|A|
|C|
|A|
___
Aber ich möchte Aalle Fragmente darüber (falls vorhanden) wieder aufnehmen und zerstören. Eigentlich gefällt mir nur das Standardverhalten des Backstacks.
Wie schaffe ich das?
Erwartet: ( Asollte wieder aufgenommen werden und obere Fragmente sollten zerstört werden)
| |
| |
| |
|A|
___
Bearbeiten: (vorgeschlagen von A - C)
Dies ist mein Versuchscode:
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);
}
Das Problem ist, wenn ich starte Aund dann B'Zurück' drücke, Bwird es entfernt und Afortgesetzt. Wenn Sie ein zweites Mal auf "Zurück" klicken, wird die App beendet. Aber es zeigt ein leeres Fenster und ich muss ein drittes Mal zurück drücken, um es zu schließen.
Auch wenn ich starte A, dann B, dann C, dann Bwieder ...
Erwartet:
| |
| |
|B|
|A|
___
Tatsächlich:
| |
|B|
|B|
|A|
___
Sollte ich onBackPressed()Anpassungen vornehmen oder fehlt mir etwas?