Android:在屏幕方向更改时保存应用程序状态

时间:2011-11-11 11:19:20

标签: android screen-orientation android-screen

在发布此问题之前,我已经看过以下链接

http://www.devx.com/wireless/Article/40792/1954

Saving Android Activity state using Save Instance State

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

How to save state during orientation change in Android if the state is made of my classes?

我没有得到如何覆盖以下功能:

@Override
    public Object onRetainNonConfigurationInstance() {
        return someExpensiveObject;
    }

在我的应用程序中,当第一个editext的数据验证为true时,我的布局有一个editext可见,其他editext可见。我已将所有其他editextes和textviews的可见性设置为false,并在验证后使它们可见。

因此,在我的活动中,如果更改了屏幕方向,那么android:visibility="false"的所有项目都将不可见。

我也知道当我们的活动屏幕方向改变时,它调用onStop()后跟onDestroy(),然后通过调用onCreate()再次启动一个新活动

这是原因..但我没有得到如何解决它..

此处您可以看到我的应用程序的屏幕截图:

enter image description here 在此图像中加载所有字段 在另一张图片中,当屏幕方向变为横向时,它们都消失了

enter image description here

指向教程或代码段的任何链接都会非常有用。

我的应用程序崩溃时出现进度对话框并尝试更改屏幕方向。如何处理?

由于

3 个答案:

答案 0 :(得分:7)

如果两个屏幕都有相同的layout,那么就没有必要在manifest节点的Activity中添加以下行

android:configChanges="keyboardHidden|orientation"

适用于Android 3.2(API级别13)及更新版本:

android:configChanges="keyboardHidden|orientation|screenSize"

因为当设备在纵向和横向之间切换时,“屏幕尺寸”也会改变。这里的文档:http://developer.android.com/guide/topics/manifest/activity-element.html

答案 1 :(得分:1)

还有另一种可能性,使用onConfigurationChanged(配置newConfig)可以保持状态,因为它甚至可以改变方向。

当您的活动正在运行时,设备配置发生变化时由系统调用。请注意,只有在清单中选择了要使用configChanges属性处理的配置时,才会调用此方法。如果发生任何未选择由该属性报告的配置更改,则系统将停止并重新启动活动(而不是使用新配置启动),而不是报告它。

在调用此函数时,您的Resources对象将更新为返回与新配置匹配的资源值。

答案 2 :(得分:0)

有两种方法可以做到,第一种是在AndroidManifest.xml文件中。您可以将其添加到活动的标签中。 This documentation将为您提供深入的解释,但简单地说,它将使用这些值,并告诉活动在这些值之一更改时不要重新启动。

android:configChanges="keyboardHidden|orientation|screenSize|screenLayout"

第二个是:覆盖onSaveInstanceStateonRestoreInstanceState。这种方法需要更多的努力,但可以说是更好的方法。 onSaveInstanceState会在活动被杀死之前从活动中保存设置的值(由开发人员手动设置),而onRestoreInstanceState将在onStart() Refer to the official documentation之后恢复该信息,以进行更深入的了解。您不必实现onRestoreInstanceState,但这需要将代码粘贴在onCreate()中。

在下面的示例代码中,我要保存2个int值,微调框的当前位置以及单选按钮。

 @Override
    public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
        spinPosition = options.getSelectedItemPosition();
        savedInstanceState.putInt(Constants.KEY, spinPosition);
        savedInstanceState.putInt(Constants.KEY_RADIO, radioPosition);
        super.onSaveInstanceState(savedInstanceState);

    }

    // And we restore those values with `getInt`, then we can pass those stored values into the spinner and radio button group, for example, to select the same values that we saved earlier. 

    @Override
    public void onRestoreInstanceState(@NotNull Bundle savedInstanceState) {
        spinPosition = savedInstanceState.getInt(Constants.KEY);
        radioPosition = savedInstanceState.getInt(Constants.KEY_RADIO);
        options.setSelection(spinPosition, true);
        type.check(radioPosition);
        super.onRestoreInstanceState(savedInstanceState);
    }