2011-02-09 79 views
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()当我启动任何对话,我呼吁mUnlockScreenRotation()在我的处理程序,并在我的DialogInterface.OnClickListener的。

有时我的屏幕保持锁定状态,但它不一致。任何建议或想法为什么或如何处理?

在此先感谢您的帮助!

Ammendment:代码中我锁我的屏幕:

 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()
+0

发布代码,您正在调用'mLockScreenRotation'。 – user432209

+0

我已将代码添加到了我要求的mLockScreenRotation中。 – taraloca

回答

0

而不是把呼叫转移到对话框中改变方向(然后可能驳回所述对话刚结束),尝试推行onDismiss监听到你的对话如概述here

+0

我需要在启动对话框时锁定初始屏幕方向的方向。我没有看到这将如何用onDismiss监听器锁定我的屏幕。 – taraloca

+0

我可能误解了这个问题。当你说“有时我的屏幕保持锁定状态”时,我认为你的意思是即使在对话被解散之后(因为屏幕在不应该出现之后仍然锁定)。这是否是相反的,问题是它没有锁定始终在第一位? –

+0

尝试重现,但它对我有用。您正在测试的设备的平台版本是什么?基于您的对话类型,行为是否改变(始终锁定,始终如此) '再现? –

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); 
} 
相关问题