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
, C
und dann B
die Stapel sieht wie folgt aus :
| |
|B|
|C|
|A|
___
Und wenn ich den 'Zurück'-Knopf drücke, B
wird zerstört und C
wieder aufgenommen.
Wenn ich das Fragment jedoch A
ein zweites Mal starte, anstatt es vom Backstack fortzusetzen, wird es oben im Backstack hinzugefügt
| |
|A|
|C|
|A|
___
Aber ich möchte A
alle Fragmente darüber (falls vorhanden) wieder aufnehmen und zerstören. Eigentlich gefällt mir nur das Standardverhalten des Backstacks.
Wie schaffe ich das?
Erwartet: ( A
sollte 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 A
und dann B
'Zurück' drücke, B
wird es entfernt und A
fortgesetzt. 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 B
wieder ...
Erwartet:
| |
| |
|B|
|A|
___
Tatsächlich:
| |
|B|
|B|
|A|
___
Sollte ich onBackPressed()
Anpassungen vornehmen oder fehlt mir etwas?