2014-02-27 183 views
7

我创建了3个片段(即FragmentA,FragmentB,FragmentC)和一个MainActivity。 每个片段中都有一个按钮,用下一个片段替换为FragmentC。片段重叠在后退按钮上

我正在用FragmentC替换FragmentA(带)FragmentB(然后带)FragmentC。从FragmentA

事务到FragmentB使用以下功能

@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(); 

    } 

事务从FragmentB到FragmentC使用以下功能

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

    } 

问题是当我从与每个FragmentC,FragmentC和FragmentA重叠按下返回按钮其他。

As below screen

回答

3

您需要添加片段C,如果你想去片段B背部按从这里到堆栈中也是如此。

因此,请为片段C调用以下代码。

fragmentTransaction.addToBackStack(null); 

编辑 - 更改您正在使用从B到C去,这个当前方法

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

我不想FragmentB在stack.I希望我的交易使用backpress – rajahsekar

+0

那就不要直接添加到FragmentA,从FragmentC片段B到后面的堆栈。将C添加到背堆栈,以便当您按回时它将从背堆栈中移除,并且您将被带到A,因为B现在不在图片中。 –

+0

如何将fragmentC添加到背堆栈。 – rajahsekar

0

你为什么不只是做一个框架布局的片段活动中,你可以替换框架与任何片段..

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; 
    } 
} 

} 

现在从任何片段屏幕上,你可以调用这个函数与another..like取代您的片段..

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(); 
} 

从fragement就叫

Frag1 extends Fragment 
{ 

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

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

布局片段活动..

<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> 

只是不添加B片段来支持堆叠,这样就可以来自C->直接。

+0

我正在像这样添加相同的内容,但是片段C正在重叠片段A – rajahsekar

+0

如果在片段事务中使用替换而不是添加片段,则片段不能重叠。 –

+0

当我按回按钮,然后c片段与片段重叠。 – rajahsekar

0

我有同样的问题,this answerBudius帮了我很多。

可以解决您的问题以下列方式:

1)实例化下面的听众(你必须保持FragmentC的实例的引用),而且由于fragmentA是加入到堆栈中唯一的片段,当用户按下返回按钮,记录,在返回堆栈的数量将是零

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

2)添加听者在MainActivity当后者被启动

getSupportFragmentManager().addOnBackStackChangedListener(backStackChangedListener); 

3)当活动停止

0

25支持库

例如,如果你有

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

回滚到片段只是调用删除侦听

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

0 - 是回滚堆栈的ID号

popBackStackImmediate(1, FragmentManager.POP_BACK_STACK_INCLUSIVE) 

FragmentManager.POP_BACK_STACK_INCLUSIVE,这意味着你要同时删除提供的ID

也可以拨打

getFragmentManager().popBackStackImmediate("stack_name", 0) 

“stack_name” 这是恢复

堆栈中的名称

例如

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

,如果你想恢复到B片段 就叫

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