3

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

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() 再次开始新的活动

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

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

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

在此处输入图像描述

任何指向教程或一段代码的链接都将非常受欢迎。

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

谢谢

4

3 回答 3

7

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

android:configChanges="keyboardHidden|orientation"

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

android:configChanges="keyboardHidden|orientation|screenSize"

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

于 2011-11-11T11:24:13.750 回答
1

还有另一种可能性,您可以使用 onConfigurationChanged(Configuration newConfig) 在方向更改时保持状态。

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

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

于 2012-07-23T07:27:20.640 回答
0

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

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

第二个是:覆盖onSaveInstanceStateand onRestoreInstanceState。这种方法需要更多的努力,但可以说更好。onSaveInstanceState在活动被杀死之前保存设置的值(由开发人员手动设置),并在参考官方文档onRestoreInstanceState后恢复该信息以获得更深入的了解。您不必实现,但这将涉及将该代码粘贴到.onStart() onRestoreInstanceStateonCreate()

在下面的示例代码中,我保存了 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);
    }
于 2020-04-27T13:23:12.303 回答