【问题标题】:Weird behavior in Fragment BackstackFragment Backstack 中的奇怪行为
【发布时间】:2014-02-09 03:12:20
【问题描述】:

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

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

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

startFragment(F1, false); //backstack中什么都没有

startFragment(F2, true); //F1在backstack中

startFragment(F3, false); //F1在backstack中

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

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

【问题讨论】:

    标签: android android-fragments back-stack fragmenttransaction


    【解决方案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);
    

    【讨论】:

    • 感谢您的回答,但这不是问题所在。方法 findFragmentByTag 查找在 fragmentTransaction.replace(CONTENT_VIEW_ID, fragment, fragmentTag) 方法中提供的名称。反正你说的我试过了,还是不行。
    • 你通过它的backstackentry名称在backstack上获得一个片段,它是在你addtoBackStack(tag)时设置的。您可以使用我添加的上述代码来检查您的 backstack 条目的当前名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多