3

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

例如,菜单由不同的运动组成;足球、篮球、棒球、滑雪等。当用户选择一项运动时,右侧会显示一个包含特定运动详细信息的片段。

我已经将我的应用程序设置为在 layout-large 和 layout-small-landscape 中一次显示两个片段。然而,在 layout-small-portrait 中,在给定时间只显示一个片段。

想象一下;用户正在 layout-small-landscape 中浏览应用程序(一次两个片段)并选择一项运动,Football。在他选择篮球后不久。如果他现在选择旋转到 layout-small-portrait (一次一个片段),我希望发生以下情况:

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

我目前已经解决了这个问题,如下所示:

....

@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: Fragment already added: MenuFragment (....)

谁能给我一些关于如何更好地实现这一点的指示?我当前的代码一点也不漂亮,我相信很多开发人员都想实现这一点。

提前致谢!

4

1 回答 1

2

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

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

在这里解释得更好:-

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

希望有帮助。

于 2013-01-23T22:26:39.050 回答