碎片在后退按钮上重叠

时间:2014-02-27 12:28:55

标签: android android-fragments overlap overlapping back-stack

我创建了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相互重叠。

As below screen

4 个答案:

答案 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)