it-swarm.com.de

OnResume () des Fragments wird nicht aufgerufen, wenn es aus dem Backstack gezogen wird

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.

17
nilkash

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;
}
18
Uma

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();
13
PedroDuran

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.

2
Eric Sellin

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();
    }
1

sie können diese Fragment-Methode verwenden:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
}
0
Mohammad Hadi

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
                }
            }
        }
0
GianhTran