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" 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);
}
我已经能够通过覆盖 Fragment
中的 onSaveInstanceState()
并将数据存储在 SharedPreferences
中来保存用户输入的任何文本,然后从 SharedPreferences
中的首选项加载=14=]的onResume()
方法。
我的问题是:如何在屏幕旋转时保存当前 Fragment
本身(不仅仅是用户可能输入的数据)?
目前,我决定将当前Fragment的标签保存在SharedPrefs中,然后在MainActivity的"onResume()"方法中从SharedPrefs中读取并使用与上述相同的代码加载Fragment。由于某种原因它不起作用,对我来说,它感觉像是一个 hacky/crappy 解决方案。但是,如果那是必须要做的事情,那就这样吧。不过目前还没有用。
如果我可以问第二个问题,我如何在屏幕旋转时保存用户输入的数据,而不是当用户只是导航到另一个 Fragment
时?现在,无论屏幕是否旋转或 Fragment 导航离开,用户输入的数据都会被保存。我假设这只是逻辑而不是某些特定的方法调用,但我没有看到解决方案。
非常感谢您的帮助!
在Activity
的onSaveInstanceState()
中保存当前Fragment
class的名字。在 Activity
的 onCreate()
、
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);
}
试试这个。这会起作用。
我已经尝试在此处和 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" 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);
}
我已经能够通过覆盖 Fragment
中的 onSaveInstanceState()
并将数据存储在 SharedPreferences
中来保存用户输入的任何文本,然后从 SharedPreferences
中的首选项加载=14=]的onResume()
方法。
我的问题是:如何在屏幕旋转时保存当前 Fragment
本身(不仅仅是用户可能输入的数据)?
目前,我决定将当前Fragment的标签保存在SharedPrefs中,然后在MainActivity的"onResume()"方法中从SharedPrefs中读取并使用与上述相同的代码加载Fragment。由于某种原因它不起作用,对我来说,它感觉像是一个 hacky/crappy 解决方案。但是,如果那是必须要做的事情,那就这样吧。不过目前还没有用。
如果我可以问第二个问题,我如何在屏幕旋转时保存用户输入的数据,而不是当用户只是导航到另一个 Fragment
时?现在,无论屏幕是否旋转或 Fragment 导航离开,用户输入的数据都会被保存。我假设这只是逻辑而不是某些特定的方法调用,但我没有看到解决方案。
非常感谢您的帮助!
在Activity
的onSaveInstanceState()
中保存当前Fragment
class的名字。在 Activity
的 onCreate()
、
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);
}
试试这个。这会起作用。