android 横竖屏切换问题

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值