有带有以下代码的复选框:
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() 不是解决方案,因为每个设备都有自己的 Surface.ROTATE。
所以,这是我的解决方案。
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 台平板电脑)上,它可以正常工作。
创建一个成员变量并保存当前设置的状态。空头is_landscape = -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_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="orientation"
在您的Menifest文件中,它不允许在更改设备方向时重新创建活动。
希望它能为你工作。
如果你想检测反向状态,你也可以使用
int state = (WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotate();
如果状态Surface.ROTATION_0则它将是纵向的如果状态Surface.ROTATION_90那么它将是横向的如果状态Surface.ROTATION_180则为反向纵向如果状态Surface.ROTATION_270则它将是反向横向
设置肖像以防Surface.ROTATION_0和Surface.ROTATION_180。设置景观以防Surface.ROTATION_90和Surface.ROTATION_270。
您还可以设置旋转而不是方向,以便设备处于旋转状态而不是定向状态。
既然你知道如何获取当前方向,那就写
if(isChecked){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}