显示对话框时尝试锁定屏幕旋转

Posted

技术标签:

【中文标题】显示对话框时尝试锁定屏幕旋转【英文标题】:Trying to lock screen rotation when displaying dialogs 【发布时间】:2011-06-24 05:36:21 【问题描述】:

我试图在应用程序启动对话框时将我的屏幕锁定在用户所处的任何方向,然后在对话框关闭时将其解锁。这是我的锁定和解锁代码:

   // Sets screen rotation as fixed to current rotation setting
     private void mLockScreenRotation() 
         Log.d("####################", "screen orientation is " + mContext.getResources().getConfiguration().orientation);
         // Stop the screen orientation changing during an event
         if (mContext.getResources().getConfiguration().orientation == 1) 
             ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);        
         else ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//       switch (mContext.getResources().getConfiguration().orientation)
//       
//          case Configuration.ORIENTATION_PORTRAIT:
//              ((Activity) mContext).setRequestedOrientation(
//                  ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//              break;
//          case Configuration.ORIENTATION_LANDSCAPE:
//              ((Activity) mContext).setRequestedOrientation(
//                  ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//              break;
//       
     

     // allow screen rotations again
     private void mUnLockScreenRotation()  
         this.setRequestedOrientation(
                 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
         mIsScreenRotationLocked = false;
      

我在启动任何对话框时调用 mLockScreenRotation(),并在我的处理程序和 DialogInterface.OnClickListener 中调用 mUnlockScreenRotation()。

有时我的屏幕仍处于锁定状态,但并不一致。有什么建议或想法为什么或如何处理这个问题?

提前感谢您的帮助!

修正:我锁定屏幕的代码:

 public void displayProgressDialog()
        mLockScreenRotation();
        // 获取类进度对话框的本地句柄以进行优化
        ProgressDialog temp = mProgressDialog = new ProgressDialog(this);

        // 获取消息字符串(由于某种原因,此对话框无法处理消息的 res ID)
        字符串消息 = getString(R.string.downloading);

        // 设置一些参数
        temp.setIndeterminate(true);
        temp.setTitle(R.string.weather_data);
        temp.setMessage(消息);
        temp.setCancelable(false);
        temp.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
                WindowManager.LayoutParams.MEMORY_TYPE_PUSH_BUFFERS /*WindowManager.LayoutParams.FLAG_BLUR_BEHIND*/);

        temp.show();
    

    公共无效显示位置搜索对话框()
        mLockScreenRotation();
        // 获取类进度对话框的本地句柄以进行优化
        ProgressDialog temp = mCoordinateSearchDialog = new ProgressDialog(this);

        // 获取消息字符串(由于某种原因,此对话框无法处理消息的 res ID)
        字符串消息 = getString(R.string.searching);

        // 设置一些参数
        temp.setIndeterminate(true);
        temp.setTitle(R.string.location_search);
        temp.setMessage(消息);
        temp.setCancelable(false);
        temp.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

        temp.show();

    

    公共无效 showDatafeedFailedDialog()
        mLockScreenRotation();
        新的 AlertDialog.Builder(this)
            .setTitle(R.string.network_error)
            .setMessage(R.string.weather_data_failed)
            .setPositiveButton(R.string.try_again, mTryAgainListener)
            .setNegativeButton(R.string.dismiss, null)
            。创建()
            。显示();
    

    公共无效 showCoordinateSearchFailedDialog()
        mLockScreenRotation();
        新的 AlertDialog.Builder(this)
        .setTitle(R.string.network_error)
        .setMessage(R.string.location_search_failed)
        .setPositiveButton(R.string.try_again, mCoordTryAgainListener)
        .setNegativeButton(R.string.dismiss, null)
        。创建()
        。显示();
    

    私人无效showGpsAlertDialog()
        mLockScreenRotation();
        新的 AlertDialog.Builder(this)
            .setTitle(R.string.gps_error)
            .setMessage(R.string.gps_error_details)
            .setNeutralButton(R.string.dismiss, null)
            .setPositiveButton(R.string.go_to_settings, mToSettingsListener)
            。创建()
            。显示();
    

    私人无效showGpsSearchingDialog()
        mLockScreenRotation();
        ProgressDialog temp = mGpsSearchAlertDialog = new ProgressDialog(this);

        字符串消息 = getString(R.string.location_services_details);
        字符串 btnText = getString(R.string.cancel);

        temp.setIndeterminate(true);
        temp.setTitle(R.string.location_services);
        temp.setMessage(消息);
        temp.setButton(btnText, mCancelGpsSearchListener);
        temp.setCancelable(true);
        temp.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

        temp.show();
    

    私人无效showGpsTimeoutAlertDialog()
        mLockScreenRotation();
        新的 AlertDialog.Builder(this)
        .setTitle(R.string.gps_error)
        .setMessage(R.string.gps_timeout_message)
        .setPositiveButton(R.string.try_again, mGpsTimeoutListener)
        .setNegativeButton(R.string.dismiss, mGpsTimeoutListener) // 如果还是不行就用free检查这一行
        。创建()
        。显示();
    

    私人无效showWeatherAlertDialog()
        Log.d("############", "天气警报对话框");
        mLockScreenRotation();
        字符串消息=空;
        if(mWD.getWarningTypes() == null) 返回;
        int cnt = 0;
        int size = mWD.getWarningTypes().size() - 1;
        for(字符串警告类型:mWD.getWarningTypes())
            如果(cnt == 0)消息=警告类型;
            else if(cnt == size) message += " and " + warningType;
            否则消息+=“,”+警告类型;
            cnt++;
        

        新的 AlertDialog.Builder(this)
            .setTitle(R.string.watches_and_warnings)
            .setMessage(消息)
            .setPositiveButton(R.string.go_to_accuweather, mToAlertWebListener)
            .setNeutralButton(R.string.dismiss, null)
            。创建()
            。显示();
    

    私人无效showNeedLocationAlertDialog()
        mLockScreenRotation();
        新的 AlertDialog.Builder(this).setTitle(R.string.error).setMessage(
        R.string.add_location).setNeutralButton(R.string.dismiss, null)
        .setPositiveButton(R.string.okay, mToLocationSearchListener)
        .create().show();
    

    私人无效showConnectivityAlertDialog()
        mLockScreenRotation();
        新的 AlertDialog.Builder(this).setTitle(R.string.network_error)
        .setMessage(R.string.no_connection).setNeutralButton(
        R.string.dismiss, null).create().show();
    

    私人无效 showCurrentUrlInBrowser()
        // 显示当前状态网页
        if(mWD.getURL() == null || mWD.getURL().length() 

【问题讨论】:

把代码贴在你打电话的地方mLockScreenRotation 我在调用 mLockScreenRotation 的地方添加了代码。 【参考方案1】:

这是一个糟糕的解决方案,但它确实有效。在 LG GT540(android 2.3.7) 和 Asus Transformer(Android 3.2) 上测试:

private void stopRotate()

    if(getResources().getConfiguration().orientation == 1)
    
        if( display.getOrientation() == 1 || display.getOrientation() == 2)
            setRequestedOrientation(9);
        else    
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
    else
    
        if( display.getOrientation() == 2 || display.getOrientation() == 3)
            setRequestedOrientation(8);
        else    
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    


private void startRotate()

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

【讨论】:

【参考方案2】:

不要在对话框中调用更改方向(然后可能会立即关闭所述对话框),而是尝试在您的对话框中实现 onDismiss 侦听器,如here 所述。

【讨论】:

我需要在启动对话框时锁定初始屏幕方向的方向。我看不出这将如何使用 onDismiss 侦听器锁定我的屏幕。 我可能误读了这个问题。当您说“有时我的屏幕仍处于锁定状态”时,我以为您的意思是即使在对话框关闭后(例如,屏幕在不应再锁定后仍保持锁定状态)。是相反的吗,问题是它没有首先要始终如一地锁定? 试图复制,但它对我有用。您正在测试的设备是什么平台版本?行为是否会根据您显示的对话框类型而改变(始终锁定,始终不锁定)?

以上是关于显示对话框时尝试锁定屏幕旋转的主要内容,如果未能解决你的问题,请参考以下文章

Android 4.3 上的屏幕旋转对话框

基于设备传感器覆盖旋转锁定设置旋转

在目标 c 中更改应用扩展的屏幕旋转

Flutter 真正可以监听屏幕旋转的插件

防止在Android中的屏幕旋转对话框解除

在 iOS 14 中锁定屏幕方向