2015-03-03 78 views
0

以下是我需要處理方向更改不同的基本操作,基本上每當onConfigurationChanged()事件由於設備方向更改而觸發時,我將顯示一個對話框窗口並詢問用戶是否要更新方向,根據用戶操作我更新到風景/人像或保持相同的方向。手動確認方向更改

public class MyActivity extends Activity { 
.. 
.. 
private boolean mFlagConfigChangeManual = false; 

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     Log.e("onConfigurationChanged", "mFlagConfigChangeManual="+mFlagConfigChangeManual); 

     super.onConfigurationChanged(newConfig); 

     int orient = -1; 
     if (!mFlagConfigChangeManual) { 

      if (newConfig.orientation == newConfig.ORIENTATION_LANDSCAPE) { 
       mFlagConfigChangeManual = true; 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
       orient = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 

      } else if (newConfig.orientation == newConfig.ORIENTATION_PORTRAIT) { 
       mFlagConfigChangeManual = true; 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
       orient = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 

      } 

     } else { 
      mFlagConfigChangeManual = false; 
      return; 
     } 

     final int orient2 = orient; 
     DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       switch (which) { 
       case DialogInterface.BUTTON_POSITIVE: 
        if (orient2 >= 0) { 
         mFlagConfigChangeManual = true; 
         setRequestedOrientation(orient2); 
        } 
        break; 

       case DialogInterface.BUTTON_NEGATIVE: 
        break; 
       } 
      } 
     }; 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("Would you like to update orientation?") 
       .setPositiveButton("Yes", dialogClickListener) 
       .setNegativeButton("No", dialogClickListener).show(); 

} 

我已經在清單文件中所要求的變化,但我面對的兩個問題,則顯示第一時間定向確認對話框,它的工作原理,但是當我重新定位再次,它不會做任何事情,基本上onConfigurationChanged()是不叫另一次。我注意到的另一個問題是;

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);方法在橫向模式下將視圖顛倒。這可以做得更好嗎?

回答

0

對於第一個問題,onConfigurationChanged方法不會在第一次更改後調用,因爲當您手動強制方向 觸發onConfigurationChanged方法的監聽被禁用時,這將保持新的方向,例如,如果設備是在肖像和你強制風景 如果再次觸發收聽會發生什麼? newConfig.orientation肖像的價值將再次'因爲這將是設備的實際方向。

解決這個第一個問題並不是那麼簡單,因爲我們需要通過OrientationEventListener來操縱方向並檢查旋轉度的設備。

看到這裏! manually-confirm-for-orientation-change

對於第二個問題,你剛剛所需要的setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

編輯以改變:

重新啓用傳感器u需要調用setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR);

+0

但是當我在第一塊代碼onConfigurationChanged手動調用setRequestedOrientation()事件被觸發,我正在過濾usi ng mFlagConfigChangeManual標誌,第二次同樣的事情沒有奏效。 – 2015-03-03 13:38:48

+0

@AbhishekK,要重新啓用傳感器,您需要調用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); – 2015-03-03 13:43:00

+0

是的,這是完美的..謝謝。你可以在你的答案中包含這些細節。 – 2015-03-03 13:45:15