Hallo, ich entwickle eine Android-Anwendung, in der ich verwende. Ich verwende einzelne Activity
und 3 Fragmente. Ich habe also 3 Fragmente A B C. Wenn ich von A nach B wechsle, füge ich Fragment
zum Backstack hinzu und simillar für B zu C. Wenn ich nun von C zurückklicke, wird B und A für B ebenfalls angezeigt.
Aber wenn ich von C nach B oder von B nach A komme, rufe ich nicht onResume()
oder andere Lebenszyklusmethoden von Fragment
auf.
Was ich eigentlich für jede Fragment
tun möchte, habe ich in ActionBar
einen anderen Titel. Wenn ich also in meinem Code von A nach B oder von B nach c gehe, verändere ich den Titel der Aktivität in fragment. Aber wenn ich zurück klicke, ändert sich das nicht.
Was ist das eigentliche Problem? Warum ruft Pop nach dem Backstack nicht onResume()
für meine Fragment
auf? Wie löse ich dieses Problem? Brauche Hilfe. Vielen Dank.
onResume()
der Fragment
wird nur aufgerufen, wenn die Activity
fortgesetzt wird. Das hilft dir also nicht. Selbst ich stehe gerade vor einem ähnlichen Problem. Sie können OnBackStackChangedListener
implementieren und den Fragmentnamen oben im Stack abrufen und den ActionBar
-Titel basierend darauf festlegen.
private FragmentManager.OnBackStackChangedListener getListener()
{
FragmentManager.OnBackStackChangedListener result = new FragmentManager.OnBackStackChangedListener()
{
public void onBackStackChanged()
{
FragmentManager manager = getFragmentManager();
if (manager != null)
{
if(manager.getBackStackEntryCount() >= 1){
String topOnStack = manager.getBackStackEntryAt(manager.getBackStackEntryCount()-1).getName();
Log.i("TOP ON BACK STACK",topOnStack);
}
}
}
};
return result;
}
Versuchen Sie, die replace
-Methode anstelle von add
für die FragmentTransaction
zu verwenden. Diese Arbeit für mich:
FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();
Wie bereits gesagt wurde, wird onResume()
nur aufgerufen, wenn die Aktivität selbst wieder aufgenommen wird, so dass dies überhaupt nicht helfen wird.
Sie müssen prüfen, ob Sie ein neues Fragment hinzufügen oder ein vorhandenes Fragment in Ihrer Fragmenttransaktion ersetzen:
Wenn Sie ein vorheriges Fragment replace()
haben, wird dieses vorherige Fragment von Grund auf neu erstellt, wenn Sie dorthin zurückkehren. onCreateView()
wird erneut aufgerufen, und Sie können den Titel der Symbolleiste dort aktualisieren. Sie tun es wahrscheinlich schon.
Wenn Sie ein neues Fragment add()
haben, ist das vorherige Fragment immer noch vorhanden, nur nicht sichtbar. Wenn Sie dorthin zurückkehren, müssen Sie den letzten Eintrag aus dem Back-Stack abrufen (verwenden Sie getBackStackEntryCount()
und getBackStackEntryAt()
im Fragmentmanager), rufen Sie das entsprechende Fragment-Objekt ab (verwenden Sie findFragmentByTag()
im Fragmentmanager), wandeln Sie das Fragment in einige um Basisklasse, von der alle Ihre Fragmente erben werden, und ruft eine benutzerdefinierte Methode auf, z onVisible()
in diesem Fragment. Die Standardimplementierung von onVisible()
in Ihrer Basisklasse bewirkt nichts. Überschreiben Sie in jedem Fragment, um den Titel der Symbolleiste, FAB und andere Elemente nach Bedarf zu aktualisieren. Ich rufe auch onVisible()
von onResume()
auf, um Code-Duplizierung zu vermeiden.
Fügen Sie diesen Code in Ihr Fragment ein.
@Override
public void setUserVisibleHint(boolean visible) {
super.setUserVisibleHint(visible);
if (visible && isResumed()) {
onResume();
}
}
@Override
public void onResume() {
super.onResume();
if (!getUserVisibleHint()) {
return;
}
setData();
}
sie können diese Fragment-Methode verwenden:
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
}
Ich benutze diesen Weg, füge diesen Blockcode in dein Fragment ein
requireActivity().supportFragmentManager.addOnBackStackChangedListener {
val fm = requireActivity().supportFragmentManager
fm?.let {
if (it.backStackEntryCount == YOUR_FRAGMENT_BACK_STACK_INDEX) {
// your fragment visible
}
}
}