繁体   English   中英

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

[英]Android : Save application state on screen orientation change

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

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

使用 Save Instance State 保存 Android Activity 状态

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

如果状态由我的类组成,如何在 Android 中的方向更改期间保存状态?

我不知道我应该如何覆盖以下功能:

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

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

因此,在我的活动中,如果屏幕方向发生变化,则所有具有android:visibility="false"的项目都将不可见。

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

这就是原因..但我不知道如何解决它..

在这里您可以看到我的应用程序的屏幕截图:

在此处输入图片说明 在此图像中,所有字段都已加载,而在另一张图像中,当屏幕方向更改为横向时,它们都消失了

在此处输入图片说明

任何指向教程或代码片段的链接都将是非常可观的。

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

谢谢

好吧,如果您对两个屏幕都有相同的layout ,则无需这样做,只需在Activity节点的manifest中添加以下行

android:configChanges="keyboardHidden|orientation"

对于 Android 3.2(API 级别 13)及更高版本:

android:configChanges="keyboardHidden|orientation|screenSize"

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

还有另一种可能性,您可以使用 onConfigurationChanged(Configuration newConfig) 保持状态,因为它甚至在方向更改时也是如此。

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

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

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

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

第二个是:覆盖onSaveInstanceStateonRestoreInstanceState 这种方法需要更多的努力,但可以说更好。 onSaveInstanceState在 Activity 被杀死之前保存(由开发人员手动)设置的值,而onRestoreInstanceStateonStart()之后恢复该信息。 请参阅官方文档以获得更深入的了解。 您不必实现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);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM