起因是我上安卓课有个实验,要求设置有个首选项sharedpreference来控制屏幕方向。关闭的话,活动窗口只能竖屏,打开的话就能自动切换横竖屏。 我实现后发现,我打开这个首选项,功能没问题。但是我关闭这个首选项之后,当我模拟器横过来,她还是会重绘这个活动强制把布局转换为横屏(就很丑很难受)。后来查了资料解决了。
下面是技术总结:
1.activity窗口的方向和布局文件是两码事 窗口方向的属性是指你允许这个activity是横屏、竖屏、物理感应还是啥的。 布局文件是指绘制当前activity的布局文件,他与窗口方向是分开的。 比如就算你只有一个布局文件(假设是竖屏的),但是你设置窗口模式是sensor或者landscape, 系统会自动强制把当前的布局设置成横屏的,所以为了避免布局被重绘导致布局不好看, 可以设置当前activity的窗口为横屏或者竖屏。
2.设置窗口方向有两种方式
1.属性设置,在xml的activity的screenOrientation属性设置
2.编码设置,通过setRequestedOrientation() 两种设置的参数含义都一样。
3.如何设置横竖屏自动切换 以下是一种实现方式,通过读取首选项中的屏幕方向值来选择是只有竖屏显示还是允许横屏显示。
SharedPreferences sp=getSharedPreferences(getString(R.string.preference_path),MODE_PRIVATE);
Boolean orientation=sp.getBoolean("allow_landscape",false);
if (orientation){
//如果允许横屏,设置屏幕方向问感知型
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
//这里是重点,获取当前手机屏幕的方向
int screen = getResources().getConfiguration().orientation;
if (screen == Configuration.ORIENTATION_LANDSCAPE) {
//切换横屏布局
setContentView(R.layout.activity_student_land);
} else if (screen == Configuration.ORIENTATION_PORTRAIT) {
//切换竖屏布局
setContentView(R.layout.activity_student);
}
}
else{//不允许的话,一定要设置屏幕方向固定为某个方向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}