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()
返回相同的值。