Der beste Ansatz ist die Verwendung der von Android bereitgestellten Interface OnBackStackChangedListener-Methode onBackStackChanged ().
Nehmen wir an, wir haben eine Navigationsschublade mit 4 Optionen, zu denen der Benutzer navigieren kann. In diesem Fall haben wir 4 Fragmente. Sehen wir uns zuerst den Code an und dann erkläre ich die Arbeitsweise.
private int mPreviousBackStackCount = 0;
private String[] title_name = {"Frag1","Frag2","Frag3","Frag4"};
Stack<String> mFragPositionTitleDisplayed;
public class MainActivity extends ActionBarActivity implements FragmentManager.OnBackStackChangedListener
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
....
....
getSupportFragmentManager().addOnBackStackChangedListener(this);
mFragPositionTitleDisplayed = new Stack<>();
}
public void displayFragment() {
Fragment fragment = null;
String title = getResources().getString(R.string.app_name);
switch (position) {
case 0:
fragment = new Fragment1();
title = title_name[position];
break;
case 1:
fragment = new Fragment2();
title = title_name[position];
break;
case 2:
fragment = new Fragment3();
title = title_name[position];
break;
case 3:
fragment = new Fragment4();
title = title_name[position];
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container_body, fragment)
.addToBackStack(null)
.commit();
getSupportActionBar().setTitle(title);
}
}
@Override
public void onBackStackChanged() {
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
if(mPreviousBackStackCount >= backStackEntryCount) {
mFragPositionTitleDisplayed.pop();
if (backStackEntryCount == 0)
getSupportActionBar().setTitle(R.string.app_name);
else if (backStackEntryCount > 0) {
getSupportActionBar().setTitle(mFragPositionTitleDisplayed.peek());
}
mPreviousBackStackCount--;
}
else{
mFragPositionTitleDisplayed.push(title_name[position]);
mPreviousBackStackCount++;
}
}
In dem gezeigten Code haben wir die displayFragment () -Methode. Hier zeige ich das Fragment auf der Grundlage der in der Navigationsleiste ausgewählten Option an. Die variable Position entspricht der Position des Elements, auf das in der ListView oder RecyclerView in der Navigationsleiste geklickt wurde. Ich habe den Titel der Aktionsleiste mit getSupportActionBar.setTitle (title) entsprechend festgelegt, wobei der Titel den entsprechenden Titelnamen speichert.
Immer wenn wir auf das Element aus der Navigationsleiste klicken, wird ein Fragment angezeigt, abhängig von dem Element, auf das der Benutzer geklickt hat. Auf der Back-End-Seite wird dieses Fragment jedoch zum Backstack hinzugefügt und die Methode onBackStachChanged () wird getroffen. Ich habe eine Variable mPreviousBackStackCount erstellt und auf 0 initialisiert. Außerdem habe ich einen zusätzlichen Stapel erstellt, in dem die Titelnamen der Aktionsleiste gespeichert werden. Immer wenn ich dem Backstack ein neues Fragment hinzufüge, füge ich meinem erstellten Stack den entsprechenden Titelnamen hinzu. Auf der anderen Seite wird immer dann, wenn ich die Zurück-Taste drücke, onBackStackChanged () aufgerufen und der Nachname aus meinem Stapel entfernt und der Titel auf den Namen gesetzt, der von der peek () -Methode des Stapels abgeleitet wurde.
Beispiel:
Nehmen wir an, unser Android-Backstack ist leer:
Drücken Sie Auswahl 1 aus der Navigationsleiste: onBackStachChanged () wird aufgerufen und das Fragment 1 wird zum Android-Backstack hinzugefügt, backStackEntryCount wird auf 1 gesetzt und Frag1 wird auf meinen Stapel verschoben und die Größe von mFragPositionTitleDisplayed wird 1.
Drücken Sie Auswahl 2 aus der Navigationsleiste: onBackStachChanged () wird aufgerufen und das Fragment 2 wird zum Android-Backstack hinzugefügt, backStackEntryCount wird auf 2 gesetzt und Frag2 wird auf meinen Stapel verschoben und die Größe von mFragPositionTitleDisplayed wird 2.
Jetzt haben wir 2 Elemente sowohl im Android-Stack als auch in meinem Stack. Wenn Sie die Zurück-Taste drücken, wird onBackStackChanged () aufgerufen und der Wert von backStackEntryCount ist 1. Der Code gibt den if-Teil ein und löscht den letzten Eintrag aus meinem Stapel. Der Android-Backstack hat also nur 1 Fragment - "Fragment 1" und mein Stack hat nur 1 Titel - "Frag1". Jetzt schaue ich einfach () den Titel von meinem Stapel und setze die Aktionsleiste auf diesen Titel.
Denken Sie daran: Um den Titel des Aktionsschlägers festzulegen, verwenden Sie peek () und nicht pop (). Andernfalls stürzt Ihre Anwendung ab, wenn Sie mehr als 2 Fragmente öffnen und versuchen, durch Drücken der Zurück-Taste zurückzukehren.
getActivity().setTitle(...)
), aber dies ist ein vernünftiger Ansatz. Vielen Dank.