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);
}
}
});
因此,当我检查它时,屏幕会旋转到默认的系统方向(我的平板电脑的风景)。
我需要冻结CURRENT方向。如果您将设备设置为纵向和切换CheckBox,则必须插入设备旋转,直到取消选中CheckBox。
Display.getRotation()不是解决方案,因为每个设备都有自己的Surface.ROTATION
答案 0 :(得分: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部平板电脑)上,它可以作为一个整体使用。
答案 1 :(得分:1)
既然你知道如何获得当前的方向,那就写一下
if(isChecked){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
答案 2 :(得分:1)
创建一个memeber变量并保存当前设置状态。 短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);
}
如果您不想保存和恢复实例,则可以使用。
机器人:configChanges = “取向”
在您的清单文件中,它不允许重新创建有关更改设备方向的活动。
希望它对你有用。
如果您想检测反向状态,也可以使用
int state =(WindowManager)getSystemService(WINDOW_SERVICE))。getDefaultDisplay()。getRotation();
如果状态是Surface.ROTATION_0那么它将是肖像 如果state是Surface.ROTATION_90那么它将是landscape 如果state是Surface.ROTATION_180那么它将是反向肖像 如果state是Surface.ROTATION_270那么它将是反向横向
在Surface.ROTATION_0和Surface.ROTATION_180的情况下设置肖像。 在Surface.ROTATION_90和Surface.ROTATION_270的情况下设置横向。
您也可以设置旋转而不是方向,以便您的设备处于旋转状态而不是定向状态。