使用子片段android维护片段的后台堆栈

时间:2014-08-18 06:19:32

标签: android android-fragments

我有一个叫做片段F1的活动A.现在,这个Fragment使用下面的代码调用另一个Fragment F2:

Fragment fragment = new F2Fragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame_container, fragment);
ft.addToBackStack("fragment");
ft.commit();

然后Fragement F2使用类似的代码调用另一个Fragment F3:

Fragment fragment = new F3Fragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame_container, fragment);
ft.addToBackStack("fragment");
ft.commit();

片段F3有3个子片段(3个标签),它们是使用tabhost添加的,如下所示:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        View rootView = inflater.inflate(R.layout.main_tab, container,
                false);

        mTabHost = (FragmentTabHost) rootView
                .findViewById(android.R.id.tabhost);
        mTabHost.setup(getActivity(), getChildFragmentManager(),
                R.layout.main_tab);

        Bundle arg1 = new Bundle();

        arg1.putInt("CF1", 1);
        mTabHost.addTab(
                mTabHost.newTabSpec("Tab1").setIndicator("CF1",
                        getResources().getDrawable(R.drawable.tab_left)),
                CF1Fragment, arg1);

        Bundle arg2 = new Bundle();
        arg2.putInt("CF2", 2);
        mTabHost.addTab(
                mTabHost.newTabSpec("Tab2").setIndicator("CF2",
                        getResources().getDrawable(R.drawable.tab_middle)),
                CF2Fragment.class, arg2);

        Bundle arg3 = new Bundle();
        arg3.putInt("CF3", 3);
        mTabHost.addTab(
                mTabHost.newTabSpec("Tab3").setIndicator("CF3",
                        getResources().getDrawable(R.drawable.tab_rigth)),
                CF3Fragment.class, arg2);

        return rootView;

    }

直到这一点,一切正常,正确的后退导航。 Child Fragment调用对话碎片,如下所示

            ConfirmDialogFragment cd = new ConfirmDialogFragment();
            cd.show(fm, "Confirm Fragment");

在对话框中我有一个按钮,按下该按钮必须刷新CF1 Fragmnet(从其调用的位置)。它成功刷新CF1片段的新列表,但问题是当我按下后退按钮。在按下它时应该转到F3(从CF1被调用的地方),但它在调用Dialog之前保持在CF1状态。再次按Back将其带到Fragment F3。 我尝试了很多东西,但似乎没有什么对我有用。我假设当从CF1调用Confirm Dialog时,它将自己置于Backstack之上,因此当从CF1按下后退时,它将从Dialog Fragment调用的地方恢复到状态。我知道如果在调用dialogfragment时不能将它放在backstack上,这将解决但是 到目前为止似乎没有任何工作。请指教。

1 个答案:

答案 0 :(得分:0)

使用下面的代码从backstack中删除片段

FragmentManager fragmentManager = getSupportFragmentManager();

            if (fragmentManager .getBackStackEntryCount() > 0){
                fragmentManager .popBackStack();
            }