webentwicklung-frage-antwort-db.com.de

Android: Kehren Sie beim Zurückdrücken zum vorherigen Fragment zurück

Ich habe Navigation Drawer implementiert, eine Unterklasse von Activity. Ich habe viele Fragmente in meiner Bewerbung. Meine Frage geht hier her

Stellen Sie sich vor, es gibt 3 Fragmente:

Fragment_1: Fragment_2: Fragment_3

Wenn ich meine Anwendung starte, wird Fragment_1 geladen Wenn ich einige Komponenten in Fragment_1 anklicke, navigiere ich zu Fragment_2 und so weiter.

Also ist es so

Fragment_1> Fragment_2> Fragment_3

Wenn ich die Taste von Fragment_2 zurück drücke, gehe ich zurück zu Fragment_1 Wenn ich jedoch die Taste von Fragment_3 zurück drücke, gehe ich zurück zu Fragment_1 (statt Fragment_2)

Ich möchte so etwas in meiner Anwendung beim Zurücktasten drücken

Fragment_1 <Fragment_2 <Fragment_3

Ich habe Fragment, FragmentManager und FragmentTransaction wie folgt verwendet: 

MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getFragmentManager();

fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit();

und ich habe versucht, onBackPressed () in meiner MainActivity zu überschreiben:

@Override
public void onBackPressed() {


        getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        int count = getFragmentManager().getBackStackEntryCount();
        if (count == 0)
               super.onBackPressed();
    }
18
Hvn

Aktualisieren Sie Ihre Activity#onBackPressed()-Methode auf:

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

Der Grund, warum Ihre Implementierung nicht funktioniert, ist, dass die Methode FragmentManager#popBackStack() asynchron ist und nicht unmittelbar nach dem Aufruf auftritt.

Aus der Dokumentation:

Diese Funktion ist asynchron - die Anforderung wird in eine Warteschlange eingefügt, die Aktion wird jedoch erst ausgeführt, wenn die Anwendung zu ihrer Ereignisschleife zurückkehrt.

Referenz: http://developer.Android.com/reference/Android/app/FragmentManager.html#popBackStack(Java.lang.String,%20int)

34
Leandro

Sie müssen Ihre eigene Backstack-Implementierung wie hier beschrieben implementieren

Separate Backstacks für jede Registerkarte in Android mithilfe von Fragmenten

Sie können popFragments () immer dann aufrufen, wenn Sie in einem Fragment auf die Zurück-Schaltfläche klicken, und PushFragments () aufrufen, wenn Sie von einem Fragment zu einem anderen navigieren.

zusamenfassend,

public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}
3
sam

Der Tric ist in FragmentManager#executePendingTransactions();.

Dies ist, was ich auch für verschachtelte Fragmente verwende ...:

/**
 * if there is a fragment and the back stack of this fragment is not empty,
 * then emulate 'onBackPressed' behaviour, because in default, it is not working.
 *
 * @param fm the fragment manager to which we will try to dispatch the back pressed event.
 * @return {@code true} if the onBackPressed event was consumed by a child fragment, otherwise
 */
public static boolean dispatchOnBackPressedToFragments(FragmentManager fm) {

    List<Fragment> fragments = fm.getFragments();
    boolean result;
    if (fragments != null && !fragments.isEmpty()) {
        for (Fragment frag : fragments) {
            if (frag != null && frag.isAdded() && frag.getChildFragmentManager() != null) {
                // go to the next level of child fragments.
                result = dispatchOnBackPressedToFragments(frag.getChildFragmentManager());
                if (result) return true;
            }
        }
    }

    // if the back stack is not empty then we pop the last transaction.
    if (fm.getBackStackEntryCount() > 0) {
        fm.popBackStack();
        fm.executePendingTransactions();
        return true;
    }

    return false;
}

und in meiner onBackPressed:

                if (!FragmentUtils.dispatchOnBackPressedToFragments(fm)) {
                    // if no child fragment consumed the onBackPressed event,
                    // we execute the default behaviour.
                    super.onBackPressed();
                }
2
ahmed_khan_89

Hier ist funktionierender und getesteter Code von mir, dies wird Ihnen helfen

 private static final int TIME_INTERVAL = 2000;
private long mBackPressed;
 private void applyExit() {
    if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) {
        finish();
    } else {
         Toast.makeText(this,"Press Again to exit",Toast.LENGTH_LONG).show();
    }
    mBackPressed = System.currentTimeMillis();
}

@Override
public void onBackPressed() {
    fm = getSupportFragmentManager();
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    }
    if (fm.getFragments().size() <= 1) {
        applyExit();
    } else {
        for (Fragment frag : fm.getFragments()) {
            if (frag == null) {
                applyExit();
                return;
            }
            if (frag.isVisible()) {
                FragmentManager childFm = frag.getChildFragmentManager();
                if (childFm.getFragments() == null) {
                    super.onBackPressed();
                    return;
                }
                if (childFm.getBackStackEntryCount() > 0) {
                    childFm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    return;
                } else {
                    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    return;
                }
            }
        }
    }
}
0
Ness Tyagi

Verwenden Sie diesen Code für die Tabulatoränderung in Ihrer Hauptaktivität, um den Stapel zu löschen.

int count = getFragmentManager().getBackStackEntryCount();
        if(count>0){
            for (int i = 0; i <count; i++) {
                getFragmentManager().popBackStack();
            }
        }

Dann auf Zurück gedrückt von Ihrer Haupttätigkeit

 int count = getFragmentManager().getBackStackEntryCount();

     if (count == 0) {
         super.onbackpressed();
        }
else {
        getFragmentManager().popBackStack();
    }
 }
0
Nanda