2014-02-27 8 views
7

Ich habe 3 Fragmente nämlich (FragmentA, FragmentB, FragmentC) und eine MainActivity erstellt. In jedem Fragment befindet sich eine Schaltfläche, die sich durch das nächste Fragment bis FragmentC ersetzt.Fragmente werden auf der Schaltfläche zurück überlappen

Ich ersetze FragmentA (mit) FragmentB (dann mit) FragmentC.

Transaktion von fragmenta bis FragmentB verwendet unterhalb Funktion

@Override 
    public void fragmentreplacewithbackstack(Fragment fragment, String tag) { 

     FragmentManager fragmentManager=getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.contner,fragment , tag); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
//  fragmentManager.executePendingTransactions(); 

    } 

Transaktion von FragmentB zu FragmentC unten Funktion verwendet

public void fragmentreplace(Fragment fragment,String tag){ 
     FragmentManager fragmentManager=getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.contner,fragment , tag); 
     fragmentTransaction.commit(); 

    } 

Problem ist, wenn i-Taste zurück von FragmentC, FragmentC und fragmenta überlappen andere.

As below screen

Antwort

3

Sie benötigen Fragment C hinzufügen und auf Backstack, wenn Sie von hier zum Fragment B auf der Rückseite drücken gehen wollen.

Also rufen Sie die unten für Fragment C als auch.

fragmentTransaction.addToBackStack(null); 

EDIT - Ändern Sie diese aktuellen Methode, die Sie von B nach C zu gehen verwenden,

public void fragmentreplace(Fragment fragment,String tag){ 
    FragmentManager fragmentManager=getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.contner,fragment , tag); 
    fragmentTransaction.addToBackStack(null); //this will add it to back stack 
    fragmentTransaction.commit(); 
} 
+0

ich will nicht FragmentB in stack.I meine Transaktion fragmenta direkt gehen wollen, von FragmentC backpress mit – rajahsekar

+0

Dann fügen Sie nicht Fragment B zum hinteren Stapel. Füge C zum Backstack hinzu, so dass du beim Zurückdrücken vom Backstack entfernt wirst und zu A gehst, da B nicht im Bild ist. –

+0

wie FragmentC zum Backstack hinzuzufügen. – rajahsekar

0

, warum Sie nicht nur ein Fragment Aktivität mit einem Frame-Layout, in dem vornehmen können Sie ersetzen, Rahmen mit jedem Fragment ..

Screen extends FragmentActivity 
{ 
protected void onCreate(Bundle b) 
{ 
    super.onCreate(b); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.work); 

      callPerticularScreen(screenNumber,false,null,null); 
    } 
public void callPerticularScreen(int screenNumber,boolean addToBackStack,String nameTag,Bundle b) 
{ 
    switch(screenNumber) 
    { 
    case registrationScreen: 
     callFragForMiddleScreen(registrationPageFrag,addToBackStack,nameTag); 
     break; 
    case dashboardScreen: 
     callFragForMiddleScreen(dashboardFrag,addToBackStack,nameTag); 
     break; 
     default: 
      break; 
    } 
} 

} 

jetzt von jedem Fragment Bildschirm Sie diese Funktion aufrufen können Ihr Fragment mit another..like ersetzen ..

private void callFragForMiddleScreen(Fragment frag,boolean addToBackStack,String nameTag) 
{ 
    transFragMiddleScreen=getFragManager().beginTransaction(); 
    transFragMiddleScreen.replace(getMiddleFragId(),frag); 
    if(addToBackStack) 
    { 
      transFragMiddleScreen.addToBackStack(nameTag); 
    } 
    transFragMiddleScreen.commit(); 
    //getFragManager().executePendingTransactions(); 
} 

von Ihrem Bruchstück rufen Sie einfach

Frag1 extends Fragment 
{ 

onActivityCreate() 
{ 
middleScreen=(Screen) getActivity(); 

middleScreen.callPerticularScreen(1,true,"tag"); 
} 
} 

Layout für Fragment Aktivität ..

<RelativeLayout 
    android:id="@+id/rl2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/rl" > 

    <FrameLayout 
     android:id="@+id/middle_screen" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </FrameLayout> 
</RelativeLayout> 

nur fügen Sie nicht das Fragment B-Stack zu unterstützen, so dass Sie von c- kommen> ein direktes.

+0

Ich füge das gleiche wie folgt hinzu, aber Fragment C ist überlagert mit fragmentA – rajahsekar

+0

Das Fragment kann nicht überlagert werden, wenn Sie anstelle von in Fragmenttransaktion ersetzen verwenden. –

+0

Wenn ich die Zurück-Taste drücke, dann überschneidet sich das c-Fragment mit einem Fragment. – rajahsekar

0

Ich hatte das gleiche Problem und this answer von Budius hat mir sehr geholfen.

Sie Ihr Problem in der folgenden Art und Weise lösen:

1) Instantiate die folgenden Hörer (Sie anhand der FragmentC der Instanz zu halten haben), und da fragmenta das einzige Fragment, das das Backstack hinzugefügt ist, wenn die Benutzer die zurück-Taste drückt, wird die Anzahl der Transaktionen im Backstack Null

private OnBackStackChangedListener backStackChangedListener = new OnBackStackChangedListener() { 
    @Override 
    public void onBackStackChanged() { 
     if(getSupportFragmentManager().getBackStackEntryCount()==0) { 
      if(fragmentC!=null) { 
       getSupportFragmentManager().beginTransaction().remove(fragmentC).commit(); 
      } 
     } 
    } 
}; 

2) den Hörer in der MainActivity hinzufügen, wenn dieser gestartet wird

getSupportFragmentManager().addOnBackStackChangedListener(backStackChangedListener); 
Entfernen

3) den Hörer, wenn die Aktivität

0

25 Support-Bibliothek

beispielsweise gestoppt wird, wenn Sie

A -> B -> C 
A id is 0 
B id is 1 
C id is 2 

auf ein Fragment Rollback nur nennen

getFragmentManager().popBackStackImmediate(0 /* ID */, 0 /* flag */); 

0 - ist ID des Backstack-Eintrags zum Rollback

oder

popBackStackImmediate(1, FragmentManager.POP_BACK_STACK_INCLUSIVE) 

FragmentManager.POP_BACK_STACK_INCLUSIVE, es heißt, Sie können auch Sie mitgelieferten ID

auch

rufen entfernen möchten
getFragmentManager().popBackStackImmediate("stack_name", 0) 

"stack_name" es ist ein Name, der Backstack zurückzukehren

zum Beispiel

A -> B -> C -> D 
A in MAIN_BACK_STACK 
B in MAIN_BACK_STACK 
C in SEPARATE_BACK_STACK 
D in SEPARATE_BACK_STACK 

wenn Sie zu Fragment B zurückkehren möchten rufen Sie einfach

getFragmentManager().popBackStackImmediate("MAIN_BACK_STACK", 0) 
or 
getFragmentManager().popBackStackImmediate("SEPARATE_BACK_STACK", FragmentManager.POP_BACK_STACK_INCLUSIVE)