2017-04-01 3 views
-1

Ich versuche, Fragmente auf sehr einfache Weise zu verwalten. Ich habe eine Dienstprogrammklasse erstellt, die Fragmente zum Backstack hinzufügt, und wenn wir die Zurück-Schaltfläche drücken, wird das vorherige Fragment angezeigt. Ich bin damit einverstanden. Aber wenn ich versuche, alle Fragmente zu entfernen und das Wurzelfragment zu zeigen, kann ich das nicht richtig tun. Folgende ist meine Utility-Klasse:Wie man Fragmente im Backstack verwaltet?

public class FragmentUtil { 
private FragmentUtil() { 
} 

public static void animatedReplace(FragmentActivity activity, int containerId, Fragment fragment, Bundle args, boolean addToBackStack){ 
    FragmentTransaction transaction=activity.getSupportFragmentManager().beginTransaction(); 
    fragment.setArguments(args); 
    if(addToBackStack){ 
     transaction.addToBackStack(fragment.getClass().getName()); 
    } 
    transaction.setCustomAnimations(R.anim.slide_from_right, R.anim.slide_to_left,R.anim.slide_from_left,R.anim.slide_to_right); 
    transaction.replace(containerId,fragment); 
    transaction.commit(); 
} 

public static void clearBackStackToHome(FragmentActivity activity){ 
    FragmentManager manager = activity.getSupportFragmentManager(); 
    manager.popBackStack(DashboardFragment.class.getName(),FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 
} 

Wenn ich zu einem anderen Fragment möchte ich nur passieren "true" für addToStack in animatedReplace Verfahren. Wenn ich den Backstack löschen möchte, übergebe ich "false" und rufe die clearBackStackToHome-Methode auf. Kann mir jemand helfen, was ich falsch mache?

Antwort

0

Stellen Sie eine Bedingung her, bei der die Überprüfung von backStack leer ist oder nicht. wenn alle Fragmente von Backstack entfernt werden, zeigen dann Ihre Wurzel Fragment

0

Try this:

in der Utility-Klasse:

public void clearBackStack() { 
    FragmentManager manager = activity.getSupportFragmentManager(); 
    if (manager.getBackStackEntryCount() > 0) { 
     FragmentManager.BackStackEntry first = manager 
       .getBackStackEntryAt(0); 
     manager.popBackStack(first.getId(), 
       FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
} 

stellen Sie sicher, in Ihrem root/erste Fragment animatedReplace() Sie boolean addToBackStack = false passieren.

so dass es nicht gelöscht wird.

EDIT

es nutzen zu können, in OnBackPressed() überschreiben onBackPressed() in Ihrer Aktivität und fügen Sie den folgenden Code ein:

@Override 
    public void onBackPressed() { 
     FragmentManager fm = getSupportFragmentManager(); 
     if (fm.getBackStackEntryCount() > 0) { 
      FragmentManager.BackStackEntry first = fm 
        .getBackStackEntryAt(0); 
      fm.popBackStack(first.getId(), 
        FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      Log.i("MainActivity", "popping backstack"); 
     } else { 
      super.onBackPressed(); 
     } 
    } 
+0

Hallo rafsanahmad007! Die Lösung funktioniert ziemlich gut. Aber, wie man es auf onBackPressed() implementiert? –

+0

@HiteshPamnani Ich habe die Antwort bearbeitet .. – rafsanahmad007

+0

Es wird jedes Mal passieren, wenn der Benutzer zurück Knopf tippt. Ich möchte nur nach einem bestimmten Prozess passieren. Beispielsweise kann der Benutzer nach Abschluss des Zahlungsvorgangs auf die Schaltfläche Zurück tippen und zu einem Stammfragment navigieren. –

0

Ja, können Sie Fragment zurück Presse in verwalten onBackPressed() Methode Ihre MainActivity. überschreiben Sie einfach onBackPressed(), und überprüfen Sie backStack Anzahl, wenn die Anzahl Null ist, dann zu Ihrem Stammfragment navigieren oder von der App zu beenden. Außerdem können Sie Ihren Code implementieren, um zu überprüfen, welches Fragment im Backstack ist.

@Override 
public void onBackPressed() { 


    FragmentManager fm = getSupportFragmentManager(); 
    int count = fm.getBackStackEntryCount(); 
    if (count >= 1) { 
     if (fm.findFragmentById(R.id.main_container) instanceof yourFragment) { 

      super.onBackPressed(); 

     } 
    } else { 
     // Show your root fragment here 
    } 

} 
Verwandte Themen