我创建了3个片段,即(FragmentA,FragmentB,FragmentC)和一个MainActivity。 每个片段中都有一个按钮,它将自己替换为FragmentC的下一个片段。
我正在用FragmentB替换FragmentA(然后使用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相互重叠。
答案 0 :(得分:5)
如果你想从这里回到片段B,你需要将碎片C添加到backstack。
所以也请将下面的片段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();
}
答案 1 :(得分: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;
}
}
}
现在从任何片段屏幕都可以调用此函数将片段替换为另一个.. 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();
}
来自你的誓言,请致电
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-&gt;直接。
答案 2 :(得分:0)
我遇到了同样的问题this answer Budius给了我很多帮助。
您可以通过以下方式解决问题:
1)实例化以下监听器(你必须保留FragmentC实例的引用),因为fragmentA是添加到backstack的唯一片段,当用户按下后退按钮时,后台堆栈将为零
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)在活动停止时删除监听器
答案 3 :(得分:0)
25支持库
例如,如果你有
A -> B -> C
A id is 0
B id is 1
C id is 2
回滚到A片段只需调用
getFragmentManager().popBackStackImmediate(0 /* ID */, 0 /* flag */);
0 - 是要回滚的Backstack条目的ID
或
popBackStackImmediate(1, FragmentManager.POP_BACK_STACK_INCLUSIVE)
FragmentManager.POP_BACK_STACK_INCLUSIVE,表示您还想删除提供的ID
你也可以打电话
getFragmentManager().popBackStackImmediate("stack_name", 0)
&#34; stack_name&#34;它是一个回归的背书名称
例如
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)