Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:将应用程序状态保存在屏幕上更改方向_Android_Screen Orientation_Android Screen - Fatal编程技术网

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 this
onRetainonConfiguration实例()
使用该函数???@Shruti如果您有不同的布局文件,则必须保存布局更改时的数据,因为布局在此条件下交换确定,并且当进度条显示时,当有人更改方向时,如何防止应用程序崩溃?一旦使用上述方法,活动将不会崩溃重新启动,因此progressbar也不会关闭,然后你的应用程序也不会崩溃。我想,你必须使用
onSaveInstanceState(Bundle)
保存每个视图的可见性。这是一个关于如何使用保存的实例状态Bundle检查处理活动状态的好教程