Android中奇怪的屏幕旋转行为

时间:2017-09-13 21:04:12

标签: android android-activity rotation orientation

我的应用中有两项活动。

当设备处于纵向位置时显示主要活动,当设备转为横向时,启动“摘要屏幕”活动(ShowAndTellActivity)。

应用程序的这一部分似乎可靠地运行,并通过以下方式实现:

@Override
public void onConfigurationChanged (Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    int orientation=newConfig.orientation;

    switch(orientation) {

        case Configuration.ORIENTATION_LANDSCAPE:

            show_and_tell_intent.setClass(getApplicationContext(),ShowAndTellActivity.class);
            show_and_tell_intent.putExtra("each_pays", v_currency_symbol.concat(new DecimalFormat("0.00").format(v_each_to_pay)));
            startActivity(show_and_tell_intent);

            break;

        case Configuration.ORIENTATION_PORTRAIT:

            break;

    }
}

当设备旋转回纵向位置时,摘要活动包含以下代码finish()活动:

@Override
public void onConfigurationChanged (Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    int orientation=newConfig.orientation;

    switch(orientation) {

        case Configuration.ORIENTATION_LANDSCAPE:

            break;

        case Configuration.ORIENTATION_PORTRAIT:

            finish();
            break;

        case Configuration.ORIENTATION_UNDEFINED:

            finish();
            break;

    }
}

然而,当设备第一次旋转回肖像时,摘要活动没有完成 - 而是摘要屏幕以纵向显示(看起来很糟糕)。

将设备旋转回横向(摘要屏幕再次显示为OK),然后再次回到纵向,导致摘要活动按预期完成。

从这一点开始旋转设备似乎可靠地工作,应用程序正确切换活动。换句话说,它只是第一次回到纵向,似乎不会触发摘要活动的finish()

几乎就像摘要屏幕活动开始时一样,直到它改变了一次它才知道它的方向。

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。在我的情况下,onConfigurationChanged没有第一次被调用。对我来说onRestoreInstanceState()工作

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) 
{
    super.onRestoreInstanceState(savedInstanceState);
    if (savedInstanceState != null) 
    {
        switch(getResources().getConfiguration().orientation) {
            case Configuration.ORIENTATION_LANDSCAPE:
                break;

            case Configuration.ORIENTATION_PORTRAIT:
                finish();
                break;

            case Configuration.ORIENTATION_UNDEFINED:
                finish();
                break;
        }

    }
}

答案 1 :(得分:0)

我能找到实现这一目标的唯一可靠方法是编写自己的旋转检测处理程序:

    myOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL){

        @Override
        public void onOrientationChanged(int deviceAngle){
            if (deviceAngle >= 320 || deviceAngle <= 40) {
                finish();
            }
        }
    };

在第二个活动中使用内置的onConfigurationChanged并不可靠 - 它在从横向到纵向的第一次旋转时总是失败。