在发布此问题之前,我已经看过以下链接
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()再次启动一个新活动
这是原因..但我没有得到如何解决它..
此处您可以看到我的应用程序的屏幕截图:
在此图像中加载所有字段 在另一张图片中,当屏幕方向变为横向时,它们都消失了
指向教程或代码段的任何链接都会非常有用。
当我的应用程序崩溃时出现进度对话框并尝试更改屏幕方向。如何处理?
由于
答案 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"
第二个是:覆盖onSaveInstanceState
和onRestoreInstanceState
。这种方法需要更多的努力,但可以说是更好的方法。 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);
}