安卓:在屏幕方向改变时保存应用状态

问题描述 投票:3回答:3

在发布这个问题之前,我看到了以下链接

http:/www.devx.comwirelessArticle407921954

使用保存实例状态保存Android活动状态

http:/www.gitshah.com201103how-to-handle-screen-orientation_28.html

在Android中,如果状态是由我的类构成的,如何保存方向变化时的状态?

我不明白我应该如何覆盖下面的功能。

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

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

所以在我的活动中,如果改变屏幕方向,那么所有的项目都会有 android:visibility="false" 变得不可见。

我还知道,当我们的活动屏幕方向发生变化时,它会调用onStop(),接着调用onDestroy(),然后再次通过调用onCreate()来启动一个新的活动。

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

在这里,你可以看到我的应用程序的屏幕截图。

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

enter image description here

任何教程或代码的链接都将非常感激。

还有 当一个进度对话框出现时,我的应用程序崩溃了 是显示出来,我试图改变屏幕方向.如何处理这个?

谢谢你

android screen-orientation android-screen
3个回答
7
投票

好吧,如果你有同样的 layout 那么就不需要这样做了,只需要在你的 manifestActivity 节点

android:configChanges="keyboardHidden|orientation"

适用于Android 3.2 (API level 13)及更新版本。

android:configChanges="keyboardHidden|orientation|screenSize"

因为当设备在纵向和横向之间切换时,"屏幕尺寸 "也会改变。文件在这里。http:/developer.android.comguidetopicsmanifestactivity-element.html。


1
投票

还有一种可能性,你可以使用onConfigurationChanged(Configuration newConfig)来保持状态,即使是在方向发生变化时。

当你的活动运行时设备配置发生变化时,系统会调用这个函数。请注意,只有当您在清单中选择了您想用configChanges属性处理的配置时,才会调用该函数。如果发生了任何没有被该属性选择报告的配置变化,那么系统将停止并重新启动活动(以新的配置来启动它),而不是报告它。

在这个函数被调用的时候,你的资源对象将被更新以返回与新配置相匹配的资源值。


0
投票

有2种方法可以做到这一点,第一种是在 AndroidManifest.xml 文件。你可以将其添加到你的活动的标签中。这个文件 会给你一个深入的解释,但简单地说,它使用这些值,并告诉活动在其中一个值改变时不要重新启动。

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

第二个是:覆盖 onSaveInstanceStateonRestoreInstanceState. 这种方法需要更多的努力,但可以说是更好的。onSaveInstanceState 在活动被杀死之前,保存了活动中设置的值(由开发者手动设置),而且 onRestoreInstanceState 后恢复该信息。onStart() 参考正式文件 以获得更深入的观察。你不需要实现 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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.