对话框打开时如何处理屏幕方向更改?

2022-09-04 23:15:02

我有一个Android应用程序,它已经在处理方向的更改,即清单中有一个,活动中有一个处理程序,可以切换到适当的布局并准备它。我有一个横向/纵向版本的布局。android:configChanges="orientation"onConfigurationChange()

我面临的问题是,该活动有一个对话框,当用户旋转设备方向时,该对话框可能会打开。我还有一个横向/纵向版本的对话框。

我应该动态更改对话框的布局,还是锁定活动的旋转,直到用户关闭对话框。

锁定应用程序的后一个选项吸引了我,因为它不必在对话框中执行任何特殊操作。我假设我可能会在对话框打开时禁用方向,例如

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

然后当它关闭时

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

这样做会是明智之举吗?如果屏幕方向在锁定时确实发生了变化,那么在解锁时,它会立即感觉到方向的变化吗?

有替代方案吗?


答案 1

我建议不要关闭屏幕旋转,而是处理对话框的配置更改。您可以使用以下两种方法之一:

第一个是在 onSaveInstanceState(outState) 方法中使用标志变量,并恢复对话框 onCreate(bundle) 方法:

在这个例子中,我的标志变量被称为“isShow Dialog”,当android系统首次调用onCreate方法时,捆绑参数将为null,没有任何反应。但是,当通过配置更改(屏幕旋转)重新创建活动时,捆绑包将具有布尔值 isShow Dialog,该值以前由 inSaveInstanceState(...) 方法保存,因此,如果变量变为 true,则再次创建对话框,此处的技巧是在对话框显示时将标志设置为 true,在未显示时设置为 false, 是一个小而简单的技巧。

Class MyClass extends Activity {
    Boolean isShowingDialog = false;
    AlertDialog myDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if(savedInstanceState!=null){
            isShowingDialog = savedInstanceState.getBoolean("IS_SHOWING_DIALOG", false);
            if(isShowingDialog){
                createDialog();
            }
        }

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean("IS_SHOWING_DIALOG", isShowingDialog);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onPause() {
        if(myDialog!=null && myDialog.isShowing()) {
            myDialog.dismiss();
        }
    }

    private void createDialog() {
        AlertDialog.Builder dialog_builder = new AlertDialog.Builder(this);
        dialog_builder.setTitle("Some Title"):
        ... more dialog settings ...

        myDialog = dialog_builder.create();
        myDialog.show();
        isShowingDialog = true;
    }

    private void hideDialog(){
        myDialog.dismiss();
        isShowingDialog = false;
    }
}

第二种方法是使用片段组件的功能来保留其状态,主要思想是在片段内创建对话框,在配置更改期间存在分离和重新附加片段的问题(因为您需要关闭并正确显示对话),但解决方案与第一种方法非常相似。此方法的优点是,如果您有一个具有多个配置的 AlertDialog,则在重新创建片段时,无需再次创建和设置对话框,只需使其 show() 并且 AlertDialog 状态由片段维护。

我希望这有帮助。


答案 2

我建议你的对话框应该覆盖并将其状态保存到捆绑包中。onSaveInstanceState()onRestoreInstanceState(Bundle)

然后,在 Activity 中重写这些方法,检查是否显示对话框,如果显示, 则调用对话框的方法保存并还原其状态。

如果要从片段显示此对话框,则需要覆盖而不是 。OnActivityCreated(Bundle)OnRestoreInstanceState

有关源示例,请参阅 Android 随附的内置时钟应用,其中 SetAlarm Activity 以这种方式处理 TimePickerDialog。


推荐