2

有带有以下代码的 CheckBox:

    CheckBox cb = (CheckBox)findViewById(R.id.freezer);
    cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
            }
        }
    });

所以,当我检查它时,屏幕会旋转到默认的系统方向(我的平板电脑的横向)。

我需要冻结当前方向。如果您将设备转为纵向并切换 CheckBox,则必须输入设备旋转,直到取消选中 CheckBox。

Display.getRotation() 不是解决方案,因为每个设备都有自己的 Surface.ROTATION

4

3 回答 3

6

所以,这是我的解决方案。

private int getCurentOrientation() {
    Display d = ((WindowManager) getSystemService(WINDOW_SERVICE))
            .getDefaultDisplay();
    boolean isWide = d.getWidth() >= d.getHeight();
    switch (d.getRotation()) {
    case Surface.ROTATION_0:
        return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    case Surface.ROTATION_90:
        return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    case Surface.ROTATION_180:
        return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
                : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    case Surface.ROTATION_270:
        return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
                : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    }
    return -1;
}

private void lockOrientation(boolean lock) {
    if (lock) {
        setRequestedOrientation(getCurentOrientation());
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    }
}

在 4 台设备(2 台智能手机和 2 台平板电脑)上,它可以正常工作。

于 2012-04-26T12:43:20.120 回答
1

既然你知道如何获得当前方向,就写

if(isChecked){
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
于 2012-04-25T05:21:17.497 回答
1

创建一个成员变量并保存当前设置状态。短is_landscape = -1;

oncheckedchange 监听器,您可以永久设置状态并保存。

if (is_landscape == -1) {
    Configuration config_screen = getResources().getConfiguration();
    int orientation = config_screen.orientation;
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
       setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);
       is_landscape = 0;
    } else {
       setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
       is_landscape = 1;
   }
}

问题是,每当您旋转设备时,它都会重新创建您的活动,因此您会失去状态。所以只需将您的 is_landscape 变量保存在

@Override
protected void onSaveInstanceState(Bundle outState) {
    oustate.putExtra("last_state", is_landscape);
    super.onSaveInstanceState(outState);
}

you can restore your position on on restore instance

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    is_landscape = savedInstanceState.getShort("last_state");
    if (is_landscape == 0) {
        setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);
    } else if (is_landscape == 1) {
        setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
    }
    super.onRestoreInstanceState(savedInstanceState);
}

如果您不想保存和恢复实例,那么您可以使用。

android:configChanges="方向"

在您的清单文件中,它不允许在更改设备方向时重新创建活动。

希望它对你有用。

如果你想检测反向状态也可以使用

int state = (WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotation();

如果状态是 Surface.ROTATION_0 那么它将是纵向 如果状态是 Surface.ROTATION_90 那么它将是横向 如果状态是 Surface.ROTATION_180 那么它将是反向纵向 如果状态是 Surface.ROTATION_270 那么它将是反向横向

在 Surface.ROTATION_0 和 Surface.ROTATION_180 的情况下设置纵向。在 Surface.ROTATION_90 和 Surface.ROTATION_270 的情况下设置景观。

您还可以设置旋转而不是方向,以便您的设备处于旋转状态而不是定向状态。

于 2012-04-25T05:51:53.680 回答