手动确认方向更改

时间:2015-03-03 12:21:38

标签: android

下面是我需要以不同方式处理方向更改的Activity,基本上每当因设备方向更改而触发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);方法在横向模式下将视图颠倒定向。这可以做得更好吗?

1 个答案:

答案 0 :(得分:0)

对于第一个问题,第一次更改后不会调用onConfigurationChanged方法,因为当你手动强制定位时 触发onConfigurationChanged方法的监听被禁用,以保持新的方向,例如,如果设备是纵向的并且您强制横向 如果再次触发听力会发生什么? newConfig.orientation肖像的值将再次出现,因为这将是设备的实际方向。

要解决这个问题并不是那么简单,因为我们需要通过OrientationEventListener来操纵方向,并检查设备的旋转程度。

看到这里! manually-confirm-for-orientation-change

对于第二个问题,您只需要更改setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

由此setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

<强>编辑:

要重新启用传感器,您需要调用setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR);