Android 冻结屏幕定向

Android 冻结屏幕定向,android,screen-orientation,android-screen,Android,Screen Orientation,Android Screen,有以下代码的复选框: CheckBox cb = (CheckBox)findViewById(R.id.freezer); cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

有以下代码的复选框:

    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);
            }
        }
    });
所以,当我检查它时,屏幕会旋转到默认的系统方向(平板电脑的横向)

我需要冻结当前方向。若将设备设置为纵向并切换复选框,则必须启用设备旋转,直到取消选中复选框


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

既然您知道如何获取当前方向,只需编写

if(isChecked){
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

创建memeber变量并保存当前设置状态。 短是_景观=-1

一旦选中更改侦听器,您就可以永久设置状态并保存它

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_横向变量保存在

@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=“方向”

在menifest文件中,它将不允许在更改设备方向时重新创建活动

希望它对你有用

如果要检测反向状态,也可以使用

int state=(WindowManager)getSystemService(WINDOW_服务)).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的情况下设置横向


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

因此,下面是我的解决方案

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台平板电脑)它可以像nedded一样工作。

您的代码在反向横向和反向纵向上会失败。如果它在横向和纵向上工作,那么您可以让它工作。我给了您一个想法,您只需要检测反向横向和反向端口模式并保存其状态并恢复。我给了您一个想法,您现在可以保存反向状态在restore Instance上恢复它剩下的事情是,您只需要检测反转\u横向和反转\u纵向并保存它。正如我下面所说的,
Display.getRotation()
返回“屏幕从其“自然”方向的旋转”,因此在不同的设备表面上。旋转\u 0可以是屏幕方向和纵向(适用于高屏幕,如智能手机)和屏幕方向(适用于平板电脑).好的,使用两个不同的变量一个保存方向,另一个保存旋转如果方向是横向的,旋转小于180,则它不是反向的,否则可以按照这样的方式进行反向设置。我还试图找到其他方法。
Display Display=((WindowManager)getSystemService(WINDOW_服务)).getDefaultDisplay();int orientation=display.getOrientation();
//纵向=1;横向=2;@styanton接受正确/适合您的答案。
display.getRotation()
返回“屏幕从“自然”方向的旋转”因此,在不同的设备上,Surface.ROTATION\u 0既可以是屏幕方向纵向(对于高屏幕,如智能手机)也可以是屏幕方向横向(对于平板电脑)。这就是为什么这个答案不正确的原因。嗯@styanton我曾建议过
display.getoritation();
而不是
display.getRotation()
这是我不推荐你做的一些事情!!!Google documentations说,如果不推荐使用,那么它应该只用于向后兼容。我认为
display.getOrientation()
返回相同的值。