2014-03-05 73 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?