2016-07-22 4 views
1

Ich habe ein Problem mit popBackStack in Android. Ich habe 3 MenuItem der Navigation Schublade FragA, FragB, FragC.My Problem, wenn ich auf FragA klicke, dann auf FragB klicke, dann auf FragC klicke mein gesamtes Fragment 3. Ich drücke zurück, dann wird FragC entfernt und FragB fortgesetzt . Ich erwarte, dass wenn ich Zurück drücke, es zu FragA zurückkehren wird. Hier ist mein Code unten. Bitte geben Sie mir eine Lösung. Danke im Voraus.Nicht zu PopBack zu erwarteten Fragment in Android

Code, wenn ich Fragmentstapel hinzufüge.

Fragment fragment = null; 
if(menuItem.getItemId() == R.id.home){ 
    fragment = new FirstFragment(); 
} 
if(menuItem.getItemId() == R.id.setting){ 
    fragment = new SecondFragment(); 
} 
if(menuItem.getItemId()==R.id.trash){ 
    fragment = new ThirdFragment(); 
} 
this.replaceFragment2(fragment); 

Methode ersetzen Fragment

private void replaceFragment2(Fragment fragment){ 
    String backStatName = fragment.getClass().getName(); 
    FragmentManager manager = getSupportFragmentManager(); 
    boolean fragmentPopped = manager.popBackStackImmediate(backStatName,0); 
    if(!fragmentPopped){ //if fragment not in backstack 
     FragmentTransaction transaction = manager.beginTransaction(); 
     transaction.replace(R.id.flContent,fragment); 
     transaction.addToBackStack(backStatName); 
     transaction.commit(); 
    } 
} 

Antwort

0

AUSPROBIEREN

Fragment fragment = null; 
if(menuItem.getItemId() == R.id.home){ 
    fragment = new FirstFragment(); 
} 
if(menuItem.getItemId() == R.id.setting){ 
    fragment = new SecondFragment(); 
} 
if(menuItem.getItemId()==R.id.trash){ 
    fragment = new ThirdFragment(); 
} 


    if (frag != null) { 

      openFragment(frag); 
      dLayout.closeDrawers(); 
      dLayout.closeDrawers(); 
       return true; 
      } 




    public void openFragment(Fragment fragment) { 
    String backStateName = fragment.getClass().getName(); 
    FragmentManager manager = getSupportFragmentManager(); 
    //fragment not in back stack, create it. 
    FragmentTransaction ft = manager.beginTransaction(); 
    if (!fragments.contains(backStateName)) { 


     // ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); 
     ft.replace(R.id.frame, fragment); 
     ft.addToBackStack(backStateName); 
     ft.commit(); 

     fragments.add(backStateName); 
     System.out.println("backStateName" + fragments); 

    } else { 
     // ft.setCustomAnimations(R.anim.right_in, R.anim.left_out,R.anim.left_in, R.anim.right_out); 
     ft.replace(R.id.frame, fragment); 
     ft.commit(); 
    } 

} 

onCreate

final android.app.FragmentManager fm = getFragmentManager(); 

    fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 

      if (getFragmentManager().getBackStackEntryCount() == 0) { 
       finish(); 
      } 

     } 
    }); 

onBackPressed

@Override 
    public void onBackPressed() { 
    if (dLayout.isDrawerOpen(GravityCompat.START)) { 
     dLayout.closeDrawer(GravityCompat.START); 
    } 
     super.onBackPressed(); 
    } 
+0

Vielen Dank. Lass es mich versuchen. – Socheat

0

die Sie interessieren,

Ersetzen Sie Ihre FragA mit FragB wie

fragmentManager.beginTransaction().replace(R.id.fragmentContainer, new FragB()).disallowAddToBackStack(); 

und fügen Sie in Ihrem Actiivty

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

Können Sie mir erklären warum disallowAddToBackStack()? – Socheat

Verwandte Themen