Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将活动恢复到其原始方向的正确方法_Android - Fatal编程技术网

Android 将活动恢复到其原始方向的正确方法

Android 将活动恢复到其原始方向的正确方法,android,Android,目前,我有一个父级活动,其方向可以是横向模式或纵向模式,具体取决于设备加速度计 它将启动一个子活动,其方向始终处于横向模式 当用户退出子活动时,I哪个父活动可以立即恢复其原始方向 我尝试下面的神话。它不起作用 public class ParentActivity extends SherlockFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.

目前,我有一个父级
活动
,其方向可以是横向模式或纵向模式,具体取决于设备加速度计

它将启动一个子
活动
,其方向始终处于横向模式

当用户退出子
活动
时,I哪个父
活动
可以立即恢复其原始方向

我尝试下面的神话。它不起作用

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);
        }
    }
代码有两个问题

  • 太晚了-启动横向子
    活动
    时,调用父
    活动
    存储实例状态
    时,获得的方向值始终为横向,尽管父
    活动
    最初处于纵向模式
  • 方向与加速计完全分离-调用
    设置请求方向
    后,父
    活动
    方向将固定,不再依赖于设备加速计。我的意图是在孩子退出活动后,恢复父母的初始定向。在那之后,通过旋转设备,我们仍然可以自由地玩家长的
    活动
    方向

  • 这是我的解决方案,它既可以解决太迟的问题也可以解决方向与加速度计完全分离的问题

    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);
            }
        }      
    }
    

    要获取当前方向,请参阅

    您可以在开始子活动之前保存方向。然后,您可以在子活动中调用finish方法后立即恢复它。也许它能做到,是的。你的建议会解决太晚的问题。但是,在调用
    setRequestedOrientation
    后,方向是否与加速计完全分离?因此,退出子活动后,您无法再旋转设备并获得相应的屏幕方向?这很奇怪。清单文件中似乎有一些配置错误,但您当然已经检查过了。。。是吗?不,这不可能是问题所在,或者你甚至在给孩子打电话之前都不能改变方向。是的。我确实检查了清单,我没有为父活动指定任何方向,但我为子活动指定了我想要的
    android:screenOrientation=“scape”
    。因此,我希望家长导向始终尊重加速计。。。。让我想想。。。可能您必须恢复(或撤消)您可能已禁用的加速计感知子活动。也许你可以通过代码强制孩子,而不是解除清单中的感应,因为,那么,也许,家长对方向变化没有反应,就好像加速计一旦禁用,就永远处于禁用状态(!)。S、 也许,请求孩子保持ni横向模式的一个更方便的方法是在。。。onCreate(?)-类似于当您请求全屏和/或NoTitle设置时。(不使用主题)