Android: Zurück zum vorherigen Fragment auf Back-Press

Ich habe Navigationsschublade implementiert, die eine Unterklasse von Aktivität ist. Ich habe viele Fragmente in meiner Bewerbung. Meine frage geht hier

Stellen Sie sich vor, es gibt 3 Fragmente:

  • Warnung: linker: app_process hat Textverlagerungen. Dies verschwendet Speicher und ist ein Sicherheitsrisiko. Bitte repariere. Berechtigungen verweigert
  • Fehler beim Importieren eines neuen Gradle-Projekts im Android-Studio
  • Eclipse - ADT Plugin nicht automatisch abschließen
  • Wie kann man einen neuen AVD in Eclipse erstellen?
  • Java.lang.RuntimeException: WakeLock untergesperrt C2DM_LIB
  • MapFragment in ScrollView
  • Fragment_1: Fragment_2: Fragment_3

    Wenn ich meine Anwendung anfange, wird Fragment_1 geladen Wenn ich auf einige Komponenten auf Fragment_1 klicke, bin ich zu Fragment_2 und so weiter navigiert ..

    So ist es so

    Fragment_1> Fragment_2> Fragment_3

    Wenn ich die rückseitige Taste von Fragment_2 drücke, gehe ich zurück zu Fragment_1 Aber wenn ich die Taste von Fragment_3 zurückschiebe, bin ich zurück zu Fragment_1 (anstelle von Fragment_2)

    Ich möchte so etwas in meiner Anwendung auf Back Key drücken

    Fragment_1 <Fragment_2 <Fragment_3

    Ich habe Fragment, FragmentManager, FragmentTransaction wie folgt verwendet:

    MyFragment fragment = new MyFragment(); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit(); 

    Und ich versuchte, onBackPressed () in meiner MainActivity zu überschreiten:

     @Override public void onBackPressed() { getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); int count = getFragmentManager().getBackStackEntryCount(); if (count == 0) super.onBackPressed(); } 

  • Wie man OnClickListener und OnTouchListener für eine ImageButton kombiniert
  • data.getExtras () erhalten ("data") Ergebnis von Bild mit niedriger Auflösung in Android
  • Was sind die richtigen Verwendungen von @NonNull und @Nullable?
  • Berechnen Sie die tatsächliche zurückgelegte Wegstrecke durch mobile
  • Wie benutzt man eine andere Launcher-Aktivität in einem Produktgeschmack?
  • Dagger, um Spott-Objekte zu injizieren, wenn es Espresso-Funktionstests für Android macht
  • 5 Solutions collect form web for “Android: Zurück zum vorherigen Fragment auf Back-Press”

    Aktualisieren Sie Ihre Activity#onBackPressed() Methode an:

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

    Der Grund, warum deine Implementierung nicht funktioniert, ist, weil die Methode FragmentManager#popBackStack() asynchron ist und nicht unmittelbar nach dem Aufruf passiert.

    Aus der Dokumentation:

    Diese Funktion ist asynchron – es ruft die Anforderung auf Pop, aber die Aktion wird nicht durchgeführt, bis die Anwendung zu ihrer Ereignisschleife zurückkehrt.

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

    Sie müssen Ihre eigene Backstack-Implementierung implementieren, wie hier erklärt

    Separate Back Stack für jede Registerkarte in Android mit Fragmenten

    Sie können die PopFragments () anrufen, wenn Sie auf die Schaltfläche "Zurück" in einem Fragment klicken und pushFragments () anrufen, wenn Sie von einem Fragment zu einem anderen navigieren.

    Zusamenfassend,

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

    Der Tric ist in FragmentManager#executePendingTransactions(); .

    Das mache ich auch für verschachtelte Fragmente …:

     /** * 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 meinem onBackPressed :

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

    Verwenden Sie diesen Code auf Tab ändern in Ihrer Hauptaktivität, um den Stack 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 deiner Haupttätigkeit das tun

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

    Hier ist die Arbeit und getestet 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; } } } } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.