1.禁止横竖屏转换
在AndroidManifest.xml文件中设置
android:screenOrientation=”portrait”//竖屏
android:screenOrientation=”landscape”//横屏
android:screenOrientation=”sensor”//根据重力感应切换
android:screenOrientation=”nosensor”//禁止转换了
在java代码中设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)//横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)//竖屏
注意:在切换横竖屏时会重新启动activity,重走生命周期。
2.横竖屏切换–加载布局
横竖屏的布局要求不同,因此切换横竖屏的同时也要切换相应的布局,切换方法有两种
第一种:
在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序为调用Activity的onCreate方法,从而加载相应的布局。
第二种:
在java中判断来加载相应的布局,在onCreate方法中加入如下判断
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE)
{
Log.i(“info”, “landscape”); // 横屏
} else if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT)
{
Log.i(“info”, “portrait”); // 竖屏
}
3.拦截横竖屏切换—onConfigurationChanged
每切换一次屏,都会执行生命周期
onPause-> onStop-> onDestory-> onCreate->onStart->onResume,因此必须要保存数据之类,麻烦
为了避免这个周期,可以在manifest.xml中添加android:configChanges=”screenSize|orientation”
注意:screenSize和orientation必须都要加才能调到onConfigurationChanged(),本人亲测。
这样每次切换屏幕就不会去调用onCreate方法,而是去调用onConfigurationChanged()。如下
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// land do nothing is ok
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// port do nothing is ok
}
}
4.自适应转换
如果想让它启动的时候是横屏的话就横屏表示,纵屏的话就纵屏表示,然后手机切换横竖屏就不能用了该怎么解决呢?
首先:在Mainfest.xml中追加
android:screenOrientation=”sensor” android:configChanges=”orientation|screenSize”
这两个属性。
第二步:取得屏幕的长和宽,进行比较设置横竖屏的变量。
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
if (width > height) {
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; //横屏
}
else{
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; //竖屏
}
第三步:在onConfigurationChanged()函数中追加this.setRequestedOrientation(orientation)就行了
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
this.setRequestedOrientation(orientation);
}
但是这样的话你切到别的画面的时候再回到原画面,它就仍然是横的或者是纵的。
所以总结一下,还是不要让他切换的好。
android:screenOrientation的可选值有:
unspecified:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向。
landscape:横屏显示(宽比高要长)
portrait:竖屏显示(高比宽要长)
user:用户当前首选的方向
behind:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
sensor:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
nosensor:忽略物理感应器,这样就不会随着用户旋转设备而更改了(”unspecified”设置除外)。
借鉴了如下朋友的文章
http://blog.sina.com.cn/s/blog_77c632410101790w.html
http://www.runoob.com/w3cnote/android-tutorial-activity.html