首页 文章

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

提问于
浏览
1

我试图在应用程序启动对话框时以任何方向锁定我的屏幕,然后在对话框解除时将其解锁 . 这是我的锁定和解锁代码:

// 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();
        // Get local handle on class progress dialog for optimization purposes
        ProgressDialog temp = mProgressDialog = new ProgressDialog(this);

        // Get message string (for some reason this dialog can't handle res IDs for messages)
        String message = getString(R.string.downloading);

        // Set some paramaters
        temp.setIndeterminate(true);
        temp.setTitle(R.string.weather_data);
        temp.setMessage(message);
        temp.setCancelable(false);
        temp.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, 
                WindowManager.LayoutParams.MEMORY_TYPE_PUSH_BUFFERS /*WindowManager.LayoutParams.FLAG_BLUR_BEHIND*/); 

        temp.show();
    }

    public void displayLocationSearchDialog(){
        mLockScreenRotation();
        // Get local handle on class progress dialog for optimization purposes
        ProgressDialog temp = mCoordinateSearchDialog = new ProgressDialog(this);

        // Get message string (for some reason this dialog can't handle res IDs for messages)
        String message = getString(R.string.searching);

        // Set some paramaters
        temp.setIndeterminate(true);
        temp.setTitle(R.string.location_search);
        temp.setMessage(message);
        temp.setCancelable(false);
        temp.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, 
                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

        temp.show();

    }

    public void showDatafeedFailedDialog(){
        mLockScreenRotation();
        new 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)
            .create()
            .show();
    }

    public void showCoordinateSearchFailedDialog(){
        mLockScreenRotation();
        new 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)
        .create()
        .show();
    }

    private void showGpsAlertDialog(){
        mLockScreenRotation();
        new 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)
            .create()
            .show();
    }

    private void showGpsSearchingDialog(){
        mLockScreenRotation();
        ProgressDialog temp = mGpsSearchAlertDialog = new ProgressDialog(this);

        String message = getString(R.string.location_services_details);
        String btnText = getString(R.string.cancel);

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

        temp.show();
    }

    private void showGpsTimeoutAlertDialog(){
        mLockScreenRotation();
        new 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)  // check this line with free if still no good
        .create()
        .show();
    }

    private void showWeatherAlertDialog(){
        Log.d("############", "weather alert dialog");
        mLockScreenRotation();
        String message = null;
        if(mWD.getWarningTypes() == null) return;
        int cnt = 0;
        int size = mWD.getWarningTypes().size() - 1;
        for(String warningType : mWD.getWarningTypes()){
            if(cnt == 0) message = warningType;
            else if(cnt == size) message += " and " + warningType;
            else message += ", " + warningType;
            cnt++;
        }

        new AlertDialog.Builder(this)
            .setTitle(R.string.watches_and_warnings)
            .setMessage(message)
            .setPositiveButton(R.string.go_to_accuweather, mToAlertWebListener)
            .setNeutralButton(R.string.dismiss, null)
            .create()
            .show();
    }

    private void showNeedLocationAlertDialog() {
        mLockScreenRotation();
        new AlertDialog.Builder(this).setTitle(R.string.error).setMessage(
        R.string.add_location).setNeutralButton(R.string.dismiss, null)
        .setPositiveButton(R.string.okay, mToLocationSearchListener)
        .create().show();
    }

    private void showConnectivityAlertDialog() {
        mLockScreenRotation();
        new AlertDialog.Builder(this).setTitle(R.string.network_error)
        .setMessage(R.string.no_connection).setNeutralButton(
        R.string.dismiss, null).create().show();
    }

    private void showCurrentUrlInBrowser(){
        // Show current conditions web page
        if(mWD.getURL() == null || mWD.getURL().length()

2 回答

  • 1

    这是一个糟糕的解决方案,但它确实有效 . 在LG GT540(Android 2.3.7)和华硕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);
    }
    
  • 0

    而不是在对话框中调用改变方向(然后可能在之后立即解除所述对话),尝试实现对话框的onDismiss监听器,如here所述 .

相关问题