2

决定重写这个问题:

我有三个片段,称为 AB C。每个片段都有一个视图,其中包含一些字段供用户填写。用户应该能够使用菜单在不同的片段之间切换。如果用户在片段 A 中填写信息,然后切换到 C 填写更多信息,然后切换回 A,则用户在 A 中键入的信息应该仍然存在。

我想我需要以某种方式使用 FragmentManager 但我无法弄清楚添加/替换/附加的正确组合......这是使其按我想要的方式工作所必需的。

有人可以提供一个代码片段,让我在保持每个片段视图状态的同时在片段之间切换。

当前工作解决方案:

mContent 是活动片段,是活动的私有成员变量。

如果有人认为这种方法有问题或使其更高效/更健壮的方法,请告诉我!

public void switchContent(String fragmentTag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    if ( fragmentManager.findFragmentByTag( fragmentTag ) != mContent ) {
        if ( !mContent.isDetached() ) {
            transaction.detach( mContent );
        }

        if ( fragmentManager.findFragmentByTag( fragmentTag ) == null ) {
            if ( fragmentTag.equals( "details" ) ) {
                mContent = ScheduleDetailsFragment.newInstance();
            } else if ( fragmentTag.equals( "notes" ) ) {
                mContent = ScheduleNotesFragment.newInstance();
            } else if ( fragmentTag.equals( "exceptions" ) ) {
                // @TODO - Create Exceptions Fragment
            }
        } else {
            mContent = ( SherlockFragment ) fragmentManager.findFragmentByTag( fragmentTag );
        }
        if ( mContent.isDetached() ) {
            transaction.attach( mContent );
        } else if ( !mContent.isAdded() ) {
            transaction.add( R.id.content_frame, mContent, fragmentTag );
        }

        transaction.commit();
    }
    getSlidingMenu().showContent();
}

谢谢你,内森

4

1 回答 1

1

我基于提供的示例之一的代码,但每次单击菜单项时它都会返回一个新片段,因此状态信息会丢失。

如果您的页面保持某种形式的状态/会话,Fragment则为每个导航事件返回一个新的用户体验是非常糟糕的,并且在内存使用方面也不是那么好。

我建议让您的滑动菜单FragmentManager在您的主菜单中使用Activity来维护Fragments您之间切换的所有内容。它将管理它们的所有状态,您可以使用findFragmentByTag(String tag). 您只需要确保每个都Fragment保存您添加的任何状态(初始创建后更改的值/数据)onSaveInstanceState(Bundle outState)并将其恢复为onCreate(Bundle savedInstanceState). 我不确定您当前使用的滑动菜单是如何管理的,所以这可能是不可能的。希望这至少可以帮助您朝着正确的方向前进。

编辑:更新问题的更新答案 - 这是我将如何切换Fragments. 通过使用替换,您将完全切换Fragments,同时重用已经创建的。为了让您的片段保存/恢复它们的状态,您需要参考我上面的答案。如果不清楚,请搜索一些如何在Fragments和中保存状态的示例Activities

public void switchContent(String fragmentTag) {

    // If our current fragment is null, or the new fragment is different, we need to change our current fragment
    if (mContent == null || !mContent.getTag().equals(fragmentTag)) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        // Try to find the fragment we are switching to
        Fragment fragment = fragmentManager.findFragmentByTag(fragmentTag);

        // If the new fragment can't be found in the manager, create a new one
        if (fragment == null) {
            if (fragmentTag.equals("details")) {
                mContent = ScheduleDetailsFragment.newInstance();
            }
            else if (fragmentTag.equals("notes")) {
                mContent = ScheduleNotesFragment.newInstance();
            }
            else if (fragmentTag.equals("exceptions")) {
                // @TODO - Create Exceptions Fragment
            }
        }
        // Otherwise, we found our fragment in the manager, so we will reuse it
        else {
            mContent = (SherlockFragment) fragment;
        }

        // Replace our current fragment with the one we are changing to
        transaction.replace(R.id.content_frame, mContent, fragmentTag);
        transaction.commit();

        getSlidingMenu().showContent();
    }
    else {
        // Do nothing since we are already on the fragment being changed to
    }
}
于 2013-02-08T00:17:03.957 回答