it-swarm.com.de

Zurück-Schaltfläche zum Schließen der App, auch wenn FragmentTransaction.addToBackStack () verwendet wird

Keine der anderen Fragen, die ich zu stackoverflow gelesen habe, konnte bei meinem Problem helfen. Soweit ich das beurteilen kann, mache ich alles richtig.

Ich habe einen Master/Detail-Flow mit Fragmenten.

Beim Erstellen der Hauptaktivität wird das Master-Fragment mit dem folgenden Code geladen:

    Fragment frag;
    frag = new MainListFragment();//<-- **the master fragment**

    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.replace(R.id.fragment_container, frag);
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());
    transaction.commit();

Das Master-Fragment hat eine ListView; Wenn Sie auf einen Listeneintrag klicken, wird das Detailfragment folgendermaßen angezeigt:

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
    super.onListItemClick(listView, view, position, id);


    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    SubListFragment frag = new SubListFragment();//<-- **the detail fragment**

    transaction.replace(R.id.fragment_container, frag);
    transaction.addToBackStack(null);
    transaction.commit();
    fm.executePendingTransactions();
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());

}

Laut LogCat ändert sich die BackStackEntryCount von 0 auf 1 , nachdem ich vom Master-Fragment zum Detail-Fragment navigiert habe: enter image description here

Warum wird die App geschlossen, wenn ich im Detailfragment auf die Schaltfläche "Zurück" klicke, anstatt zum Masterfragment zurückzukehren?

15
scottyseus

Sie müssen den Aufruf popBackStack() zur Methode onBackPressed() der Aktivität hinzufügen.

Ex:

@Override
public void onBackPressed() {
    if (fragmentManager.getBackStackEntryCount() > 0) {
        fragmentManager.popBackStack();
    } else {
        super.onBackPressed();
    }
}
57
Bobbake4

@ Bobbake4s Antwort ist großartig, aber es gibt ein kleines Problem. Angenommen, ich habe drei Fragmente A, B und C. A ist das Hauptfragment (das Fragment, das angezeigt wird, wenn ich meine App starte), B und C sind Fragmente, zu denen ich über die Navigationsleiste oder über A navigieren kann Verwenden Sie die Zurück-Taste von B oder C, um zum vorherigen Fragment (A) zurückzukehren, aber der Titel des vorherigen Fragments (Fragment B oder C) wird jetzt in der Aktionsleiste von Fragment A angezeigt. Ich muss die Zurück-Taste drücken erneut drücken, um die Rückwärtsnavigation "wirklich" abzuschließen (um die Ansicht und den korrekten Titel für das Fragment anzuzeigen und zurückzukehren)

So habe ich dieses Problem gelöst. Deklarieren Sie diese Variablen.

 public static boolean IS_FRAG_A_SHOWN = false;
 public static boolean IS_FRAG_B_SHOWN = false;
 public static boolean IS_FRAG_C_SHOWN = false;

In der MainActivity meiner App, in der Navigations-Drawer-Methoden behandelt werden, habe ich eine Methode displayView(position), die das Umschalten meiner Fragmente behandelt.

private void displayView(int position) {
    IS_FRAG_A_SHOWN = false;
    IS_FRAG_B_SHOWN = false;
    IS_FRAG_C_SHOWN = false;
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
        case 0:
            fragment = new FragmentA();
            IS_FRAG_A_SHOWN = true;
            break;
        case 1:
            fragment = new FragmentB();
            IS_FRAG_B_SHOWN = true;
            break;
        case 2:
            fragment = new FragmentC();
            IS_FRAG_C_SHOWN = true;
            break;

        default:
            break;
    }

schließlich mache ich in meiner onBackPressed -Methode Folgendes:

public void onBackPressed() {
    if(fragmentManager.getBackStackEntryCount() != 0) {
        fragmentManager.popBackStack();
        if (IS_FRAG_A_SHOWN) { //If we are in fragment A when we press the back button, finish is called to exit
            finish();
        } else  {
            displayView(0); //else, switch to fragment A
        }

    } else {
        super.onBackPressed();
    }
}
0