2014-03-05 72 views
2

目前,我有一個家長Activity,其取向可以是橫向模式或縱向模式,具體取決於設備加速度計。將活動恢復到其原始方向的正確方法

它將啓動一個小孩Activity,它的方向始終處於橫向模式。

當用戶退出子女Activity時,我可以立即恢復其原始方向。

我嘗試下面的神話。它不起作用。

public class ParentActivity extends SherlockFragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ... 

     if (savedInstanceState == null) { 
     } else { 
      int orientation = savedInstanceState.getInt(ORIENTATION_KEY); 

      // **Orientation is completely detached from Accelerometer** 
      if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
      } else { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      }    
     } 

     @Override 
     protected void onSaveInstanceState (Bundle savedInstanceState) { 
      // Calling super.onSaveInstanceState is important. 
      super.onSaveInstanceState(savedInstanceState); 

      // **Too late** 
      int orientation = getResources().getConfiguration().orientation; 

      savedInstanceState.putInt(ORIENTATION_KEY, orientation); 
     } 
    } 

有2個問題的代碼

  1. 太晚了 - 當景觀孩子Activity啓動,和家長ActivityonSaveInstanceState被調用,獲得的定向值始終景觀,雖然父母Activity原本是在肖像模式下。
  2. 方向與加速度計完全分離 - 一旦調用setRequestedOrientation,父方Activity方向將被固定,不再依賴於設備加速度計。我的意圖是在孩子Activity已退出之後恢復父母Activity初始方向。之後,通過旋轉設備,我們仍然可以隨父母Activity方向自由玩耍。
+0

可以爲您節省在開始子Activity之前的方向。您可以在您調用子Activity中的完成方法之後立即恢復它。也許它可以做到這一點。 –

+0

是的。您的建議將解決**太晚**問題。但是,**方向在調用'setRequestedOrientation'後是否完全脫離了Accelerometer **? –

+0

因此,您不再能夠在退出子Activity之後旋轉設備並獲取相應的屏幕方向?這很奇怪。似乎在清單文件中存在一些錯誤配置,但當然你已經檢查過了......是嗎?不,這不是問題所在,否則即使在致電兒童Activit之前,您也無法獲得方向更改。 –

回答

1

這裏是我的解決方案,這將既解決來不及方向是完全從加速度計

private int orientationBeforeHistory = Integer.MIN_VALUE; 

private void launchChildActivity() { 
    this.orientationBeforeHistory = Utils.getScreenOrientation(this.getActivity()); 
    ... 
} 

@Override 
public void onSaveInstanceState (Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState);   
    savedInstanceState.putInt(ORIENTATION_BEFORE_HISTORY_KEY, this.orientationBeforeHistory); 
} 


@Override 
public void onCreate (Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ... 

    if (savedInstanceState != null) { 
     final int orientationBeforeHistory = savedInstanceState.getInt(ORIENTATION_BEFORE_HISTORY_KEY); 
     if (Integer.MIN_VALUE != orientationBeforeHistory) { 
      final Activity activity = getActivity(); 
      activity.setRequestedOrientation(orientationBeforeHistory); 
      // Key step for not locking screen orientation. 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
     } 
    }  
} 

拆除,以便獲得當前的方向,請參閱How do I get the CURRENT orientation (ActivityInfo.SCREEN_ORIENTATION_*) of an Android device?