Android:旋转时,当前片段消失(如何保存状态)

Android: Upon Rotation, Current Fragment Disappears (How to Save State)

我已经尝试在此处和 Google 上进行搜索,但无法解决这个问题。任何帮助将不胜感激。

所以我的应用程序由一个 MainActivity 和多个 Fragment 组成,并且它使用了一个 NavigationDrawer。抽屉的实现与 Android documentation for NavDrawer 中的一样(使用支持库 v4)。单击左侧抽屉中的几个 ListView 项之一会加载如下 Fragment(此代码在 MainActivity 中):

Fragment fragment = MyAmmunitionFragment.newInstance();

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
               .replace(R.id.content_frame, fragment, MyAmmunitionFragment.Tag)
               .addToBackStack(Tag)
               .commit();

mLvLeftDrawer.setItemChecked(position, true);

setTitle(getString(R.string.my_ammunition));

mDrawerLayout.closeDrawer(mLvLeftDrawer);

我遇到的问题是旋转屏幕时。假设我的一个片段已加载,如上面的片段。如果旋转屏幕,则当前的Fragment消失,显示我的"homescreen"Fragment。顺便说一句,当应用程序加载一个 "homescreen" FragmentActivity 加载时,如下所示:

private void populateMainSummaryFragment(int position, boolean addToBackStack) {
    Log.v(Tag, "populateMainSummaryFragment()");

    Fragment fragment = MainSummaryFragment.newInstance();

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction()
                                                             .replace(R.id.content_frame, fragment);

    if (addToBackStack) {
        fragmentTransaction.addToBackStack(Tag);
    }

    fragmentTransaction.commit();

    mLvLeftDrawer.setItemChecked(position, true);

    //setTitle(getString(R.string.app_name));

    mDrawerLayout.closeDrawer(mLvLeftDrawer);
}

我已经能够通过覆盖 Fragment 中的 onSaveInstanceState() 并将数据存储在 SharedPreferences 中来保存用户输入的任何文本,然后从 SharedPreferences 中的首选项加载=14=]的onResume()方法。

我的问题是:如何在屏幕旋转时保存当前 Fragment 本身(不仅仅是用户可能输入的数据)?

目前,我决定将当前Fragment的标签保存在SharedPrefs中,然后在MainActivity的"onResume()"方法中从SharedPrefs中读取并使用与上述相同的代码加载Fragment。由于某种原因它不起作用,对我来说,它感觉像是一个 hacky/crappy 解决方案。但是,如果那是必须要做的事情,那就这样吧。不过目前还没有用。

如果我可以问第二个问题,我如何在屏幕旋转时保存用户输入的数据,而不是当用户只是导航到另一个 Fragment 时?现在,无论屏幕是否旋转或 Fragment 导航离开,用户输入的数据都会被保存。我假设这只是逻辑而不是某些特定的方法调用,但我没有看到解决方案。

非常感谢您的帮助!

ActivityonSaveInstanceState()中保存当前Fragmentclass的名字。在 ActivityonCreate()

if(savedInstanceState != null){

    /* get the name of the Fragment class that was previously saved
     * and load that Fragment, instead of loading HomeFragment. */

}

现在,要检查状态变化 是否 由于旋转,请使用以下命令:

创建 class 成员

private int myOrientation;

在你的 onCreate() 中,使用

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
myOrientation = display.getOrientation();

之后,覆盖方法onConfigurationChanged(),在这里你可以检查方向是否真的改变了:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    if(newConfig.orientation != myOrientation){
        // perform rotation-specific tasks
    }
    super.onConfigurationChanged(newConfig);
}

试试这个。这会起作用。