嵌套片段Backstack将新片段放在下面而不是替换

时间:2013-07-22 21:51:29

标签: android android-fragments back-stack

当我尝试在我的应用程序中使用嵌套片段的backstack时,我发生了奇怪的行为。

假设我有这个片段FragmentA,它以编程方式放在另一个rootFragment中,并设有一个用于保存片段的linearlayout。

rootFragment的布局包含:

    <LinearLayout
            android:id="@+id/map_fragmentHolder"
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_weight="1.5" />

我使用switchToFragment方法(如下所述)将FragmentA替换为FragmentB类型的片段。

public void switchToFragment(Fragment fragment, boolean addtoBackStack) {
    //Perform the fragment switch
    FragmentTransaction childTransaction = rootFragment.getChildFragmentManager().beginTransaction();
    childTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE |
            FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    childTransaction.replace(R.id.map_fragmentHolder, fragment);
    if(addtoBackStack){
        if(currentFragment != null)
            fragmentStack.push(currentFragment);
        childTransaction.addToBackStack(null);
    }
    currentFragment = fragment;
    childTransaction.commit();
}

当替换currentFragment的片段属于不同类型时,这非常有效。但是由于一些奇怪的原因,如果我尝试在当前添加了一个FragmentB类型的另一个片段时切换,则后栈突然停止工作。而不是替换线性布局中的所有片段,旧片段被放置在当前片段之下。

以下是我如何调用后台堆栈来弹出。这样做是因为onBackPressed()方法默认情况下不处理嵌套片段的后台堆栈。

public boolean onBackPressed() {
    if(fragmentStack.size() == 0)
        return false;

    //ChildFragmentManagers don't pop the backstack automatically, so we gotta do it manually...
    rootFragment.getChildFragmentManager().popBackStack();

    currentFragment = fragmentStack.pop();

    return true;
}

如果我只是简单地用以下内容替换我的onBackPressed方法,我已设法使我的应用程序工作,但是我真的想知道发生了什么,以及为什么它只发生在我用相同类型的替换片段时

public boolean onBackPressed() {
    if(fragmentStack.size() == 0)
        return false;

    switchToFragment(fragmentStack.pop(), false);

    return true;
}

非常感谢任何想法或见解。

0 个答案:

没有答案