0

我有一个处理我的片段的活动。我创建了以下方法来添加/替换片段并将它们添加(或不添加)到后台堆栈:

public void startFragment(CCFragment fragment, boolean addToBackStack) {
    final String fragmentTag = fragment.getClass().getSimpleName();
    final FragmentManager fragmentManager = getSupportFragmentManager();

            // If my fragment is already in the backstack, I don't want to add 
            // it again, but go back to it:
    boolean fragmentPopped=false;
    if(fragmentManager.findFragmentByTag(fragmentTag)!=null){
        fragmentPopped=true;
        fragmentManager.popBackStack(fragmentTag,0);
    }

            //If it is not, I want to add/replace it
    if (!fragmentPopped) {
        fragment.setFragmentDelegate(this);
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        fragmentTransaction.replace(CONTENT_VIEW_ID, fragment, fragmentTag);
        if (addToBackStack)
            fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
}

这工作正常,直到发生以下情况:

开始片段(F1,假);//backstack中没有任何内容

开始片段(F2,真);//F1在后台

开始片段(F3,假);//F1在后台

开始片段(F1,假);-> 当我调用它时,它进入“if”并且 popBackStack 将不起作用,所以我的应用程序停留在 F3 而不是返回 F1。如果我按下后退按钮,那么应用程序会转到 F1...

那么我在这里做错了什么?我已经检查了名称是否存储正确。

4

1 回答 1

1
ft.addToBackStack(tag);

我不确定这一点,但是当您将片段添加到后堆栈时,我相信您必须(再次)标记它。在您的代码中,您没有提供标签,而是使用 null,因此没有要搜索的标签,即使它会使用原始标签,您也会用 null 覆盖它。

编辑:使用以下内容来验证 backstack 上的标签名称是否与您最初分配的标签匹配。我仍然相信你的 null 正在覆盖它们。

FragmentManager mgr = getFragmentManager();                 
BackStackEntry be = mgr.getBackStackEntryAt(mgr.getBackStackEntryCount()-1);
String tag be.getName();

System.out.println("tag " + tag);
于 2014-02-09T04:09:31.557 回答