【问题标题】:Maintaining Backstack for Fragment with ChildFragments android使用 ChildFragments android 维护 Fragment 的 Backstack
【发布时间】:2014-08-18 06:19:32
【问题描述】:

我有一个调用片段 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();

然后 Fragment 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();

Fragment F3 有 3 个子 Fragments(用于 3 个 Tabs),它们是使用 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 调用 dialogfragment 如下

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

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

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

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

    FragmentManager fragmentManager = getSupportFragmentManager();

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

    【讨论】:

    • 非常感谢。你真的拯救了我的一天。
    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多