Android:将应用程序状态保存在屏幕上更改方向
在发布这个问题之前,我已经看到了以下链接 我不知道如何覆盖以下函数:Android:将应用程序状态保存在屏幕上更改方向,android,screen-orientation,android-screen,Android,Screen Orientation,Android Screen,在发布这个问题之前,我已经看到了以下链接 我不知道如何覆盖以下函数: @Override public Object onRetainNonConfigurationInstance() { return someExpensiveObject; } 在我的应用程序中,当第一个EditText的数据验证为true时,我的布局中有一个EditText可见,另一个EditText可见。我已将所有其他EditText和TextView的可见性设置为false,
@Override
public Object onRetainNonConfigurationInstance() {
return someExpensiveObject;
}
在我的应用程序中,当第一个EditText的数据验证为true时,我的布局中有一个EditText可见,另一个EditText可见。我已将所有其他EditText和TextView的可见性设置为false,并在验证后使其可见
因此,在我的活动中,如果屏幕方向发生更改,则所有具有android:visibility=“false”
的项目都将不可见
我还了解到,当我们的活动屏幕方向发生变化时,它会调用onStop(),然后再调用onDestroy(),然后再次通过调用onCreate()启动一个新的活动
这就是原因。。但我不知道该如何解决它
在这里,您可以看到我的应用程序的屏幕截图:
在此图像中,将加载所有字段
在另一幅图像中,当屏幕方向更改为横向时,它们都消失了
任何指向教程或代码的链接都是非常值得欣赏的
当出现进度对话框时,我的应用程序也会崩溃,我试图改变屏幕方向。如何处理这个问题
谢谢如果两个屏幕都有相同的
布局
,则无需这样做,只需在活动
节点中的清单
中添加下一行即可
android:configChanges="keyboardHidden|orientation"
对于Android 3.2(API级别13)及更新版本:
android:configChanges="keyboardHidden|orientation|screenSize"
因为当设备在纵向和横向之间切换时,“屏幕大小”也会改变。此处的文档:还有另一种可能,您可以使用onConfigurationChanged(配置newConfig)保持状态,即使在方向更改时也是如此 在活动运行时,当设备配置发生更改时,由系统调用。请注意,仅当您选择了要使用清单中的configChanges属性处理的配置时,才会调用此函数。如果发生任何未选择由该属性报告的配置更改,则系统将停止并重新启动活动(以使用新配置启动活动),而不是报告该更改
调用此函数时,您的资源对象将被更新,以返回与新配置匹配的资源值。有两种方法,第一种是在
AndroidManifest.xml
文件中。您可以将其添加到活动的标记中。将给您一个深入的解释,但简单地说,它使用这些值,并告诉活动在其中一个值更改时不要重新启动
android:configChanges="keyboardHidden|orientation|screenSize|screenLayout"
第二个是:重写存储实例状态上的onSaveInstanceState
和恢复实例状态上的onRestoreInstanceState
。这种方法需要更多的努力,但可以说是更好的onSaveInstanceState
在活动终止之前保存(由开发人员手动)从活动中设置的值,并且onRestoreInstanceState
在onStart()
之后恢复该信息,以便更深入地查看。您不必在RestoreInstanceState上实现,但这需要将代码粘贴到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);
}
谢谢你的回复,这对我很有用。。。那么y thisonRetainonConfiguration实例()
使用该函数???@Shruti如果您有不同的布局文件,则必须保存布局更改时的数据,因为布局在此条件下交换确定,并且当进度条显示时,当有人更改方向时,如何防止应用程序崩溃?一旦使用上述方法,活动将不会崩溃重新启动,因此progressbar也不会关闭,然后你的应用程序也不会崩溃。我想,你必须使用onSaveInstanceState(Bundle)
保存每个视图的可见性。这是一个关于如何使用保存的实例状态Bundle检查处理活动状态的好教程