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

时间:2015-06-11 04:33:24

标签: android android-fragments rotation navigation-drawer android-support-library

我已经尝试过在Google和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消失,并显示“主屏幕”Fragment。顺便说一下,当应用加载“{1}}加载”主屏幕“Fragment时,如下所示:

Activity

我能够通过覆盖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); } 中的onSaveInstanceState()并将数据存储在Fragment中,然后从{{1}中的首选项加载来保存用户输入的任何文本}} SharedPreferences方法。

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

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

如果我可以提出第二个问题,如何在屏幕旋转时保存用户输入的数据,而不是当用户仅导航到另一个onResume()时?此时,无论屏幕是旋转还是片段导航离开,用户输入的数据都会被保存。我认为它只是逻辑而不是某些特定的方法调用,但我没有看到解决方案。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

Fragment的{​​{1}}中保存当前Activity课程的名称。在onSaveInstanceState()的{​​{1}},

Activity

现在,要检查由于轮换而导致状态更改,请使用以下命令:

创建一个类成员

onCreate()

if(savedInstanceState != null){ /* get the name of the Fragment class that was previously saved * and load that Fragment, instead of loading HomeFragment. */ } 中,使用

private int myOrientation;

之后,覆盖方法onCreate(),在这里您可以检查方向是否实际发生了变化:

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

试试这个。这将有效。