具有多个片段的单个活动,典型方案。努力实现理想的行为

时间:2013-01-23 21:30:31

标签: android android-fragments

我有一个应用程序在给定时间运行带有多个(2)片段的单个活动。我在左边有一个片段,它可以作为片段的片段 显示在右侧。

举个例子可以说菜单包含不同的运动;足球,篮球,棒球,滑雪等。当用户选择一项运动时,右侧会显示一个包含特定运动细节的片段。

我已将我的应用设置为在布局大且布局小的环境中同时显示两个片段。但是,在布局 - 小肖像中,在给定时间只显示一个片段。

想象一下;用户正在布局 - 小景观(一次两个片段)浏览应用程序并选择一项运动,足球。他选择篮球后不久。如果他现在选择旋转到布局 - 小肖像(一次一个片段),我希望发生以下情况:

篮球片段应该是可见的,但如果他按下后退按钮,他应该返回菜单,而不是返回足球片段(!),默认情况下是后片组中的前一片段。

我目前解决了以下问题:

....

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // static fragments
    if(menuFragment == null) menuFragment = new MenuFragment();
    if(baseFragment == null) baseFragment = new TimerFragment(); // default content fragment

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    // Determine what layout we're in..
    if(app().getLayoutBehavior(this) == LayoutBehavior.SINGLE_FRAGMENT) {
    // We are currently in single fragment mode

        if(savedInstanceState != null) {

            if(!rotateFromSingleToDual) {
                // We just changed orientation from dual fragments to single fragment!

                // Clear the entire fragment back stack
                for(int i=0;i<getSupportFragmentManager().getBackStackEntryCount();i++) {
                    getSupportFragmentManager().popBackStack();
                }

                ft.replace(R.id.fragmentOne, menuFragment); // Add menu fragment at the bottom of the stack
                ft.replace(R.id.fragmentOne, baseFragment);
                ft.addToBackStack(null);
                ft.commit();
            }

            rotateFromSingleToDual = true;
            return;
        }

        rotateFromSingleToDual = true;

        ft.replace(R.id.fragmentOne, menuFragment);
    } else if(app().getLayoutBehavior(this) == LayoutBehavior.DUAL_FRAGMENTS) {
    // We are now in dual fragments mode

        if(savedInstanceState != null) {

            if(rotateFromSingleToDual) {
                // We just changed orientation from single fragment to dual fragments!
                ft.replace(R.id.fragmentOne, menuFragment);
                ft.replace(R.id.fragmentTwo, baseFragment);
                ft.commit();
            }

            rotateFromSingleToDual = false;
            return;
        }

        rotateFromSingleToDual = false;

        ft.replace(R.id.fragmentOne, menuFragment);
        ft.replace(R.id.fragmentTwo, baseFragment);
    }

    ft.commit();
}

这至少不时有效。但是,很多次我得到java.lang.IllegalStateException:片段已经添加:MenuFragment(....)

有人可以给我一些关于如何更好地实现这一点的指示吗?我目前的代码根本不是很好,我相信很多开发人员都想要实现这一目标。

提前致谢!

1 个答案:

答案 0 :(得分:2)

实现此方案的常用方法是仅在显示多个片段的模式下使用片段堆栈。当您处于单片段模式时,您将启动一个新活动,唯一的工作就是显示单个片段并利用活动后台堆栈。

在您的情况下,您只需要记住旋转时当前选定的点,以便在开始新活动时将其设置为参数。

这里解释得更好: -

http://developer.android.com/guide/components/fragments.html

希望有所帮助。