Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:旋转时,当前片段消失(如何保存状态)_Android_Android Fragments_Rotation_Navigation Drawer_Android Support Library - Fatal编程技术网

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);
}