Android:旋转时,当前片段消失(如何保存状态)
我试过在这里和谷歌上搜索,但就是想不出来。任何帮助都将不胜感激 因此,我的应用程序由一个Android:旋转时,当前片段消失(如何保存状态),android,android-fragments,rotation,navigation-drawer,android-support-library,Android,Android Fragments,Rotation,Navigation Drawer,Android Support Library,我试过在这里和谷歌上搜索,但就是想不出来。任何帮助都将不胜感激 因此,我的应用程序由一个main活动和多个片段s组成,它使用了一个导航抽屉。抽屉的实现方式与中的相同(使用支持库v4)。单击左侧抽屉上的几个列表视图项目之一,加载一个片段,如下所示(此代码位于MainActivity): 我遇到的问题是当我旋转屏幕时。假设我的一个片段被加载了,就像上面的一样。如果屏幕旋转,当前的片段将消失,并显示我的“主屏幕”片段。顺便说一下,当应用程序加载一个“主屏幕”时,片段由活动加载,如下所示: privat
main活动
和多个片段
s组成,它使用了一个导航抽屉
。抽屉的实现方式与中的相同(使用支持库v4)。单击左侧抽屉上的几个列表视图
项目之一,加载一个片段
,如下所示(此代码位于MainActivity
):
我遇到的问题是当我旋转屏幕时。假设我的一个片段被加载了,就像上面的一样。如果屏幕旋转,当前的片段
将消失,并显示我的“主屏幕”片段
。顺便说一下,当应用程序加载一个“主屏幕”时,片段
由活动
加载,如下所示:
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()
,并将数据存储在SharedReferences
中,然后从片段的onResume()
方法中的首选项加载
我的问题是:当屏幕旋转时(不仅仅是用户输入的数据),如何保存当前的片段本身?
目前,我决定将当前片段的标记保存在SharedPrefs中,然后保存在MainActivity的“onResume()”方法中,该方法从SharedPrefs读取,并使用与上面相同的代码加载片段。由于某种原因,它不起作用,对我来说,它感觉像是一个拙劣的解决方案。但是,如果那是必须要做的,那就这样吧。但目前它不起作用
如果我可以问第二个问题,当屏幕旋转时,而不是当用户仅导航到另一个片段时,我如何保存用户输入的数据?现在,用户输入的数据被保存,无论屏幕是否旋转或片段是否被导航离开。我假设这只是逻辑,而不是一些特定的方法调用,但我没有看到解决方案
非常感谢你的帮助 将当前片段类的名称保存在活动的onSaveInstanceState()
中。在活动
的onCreate()
中
现在,要检查状态更改是否是由于旋转引起的,请使用以下命令:
创建一个类成员
private int myOrientation;
在onCreate()
中,使用
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
myOrientation = display.getOrientation();
然后,重写configurationChanged()方法onConfigurationChanged()
,在这里您可以检查方向是否已实际更改:
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(newConfig.orientation != myOrientation){
// perform rotation-specific tasks
}
super.onConfigurationChanged(newConfig);
}
试试这个。这会有用的。太棒了,谢谢你的快速回答。所以我想我是在正确的轨道上存储了片段的标签(名称),然后根据它有选择地加载。嗯,我得弄清楚为什么那不起作用。至于屏幕旋转检测代码,谢谢老兄!我会尝试一下。所以我最终得到了当前(最后)片段的保存和恢复。基本上,我将片段的数据和名称(每个片段都有一个带有名称的公共静态“Tag”变量)保存在片段的“onSaveInstanceState()”方法的SharedReferences中。然后,在MainActivity的“oncreate()”方法中,我读取SharedPrefs并检查当前片段的名称。根据名称,我加载了相应的片段,其中包含了我在原始问题中使用的代码。逻辑被分成不同的方法,但我就是这样做的。我还没有完成旋转逻辑。由于某种原因,我无法在片段旋转后向下滚动。我得调查一下。有什么建议吗?以防万一,如果没有android:configChanges=“orientation | screenSize”将OnConfiguration更改为call,请将这一行添加到清单中
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
myOrientation = display.getOrientation();
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(newConfig.orientation != myOrientation){
// perform rotation-specific tasks
}
super.onConfigurationChanged(newConfig);
}