Android 横竖屏切换

参考Android自适应屏幕大小和layout布局(横屏|竖屏)
Activity 横竖屏切换

1.应用的横竖屏设置

应用的横竖屏设置主要是通过各个Activity的screenOrientation属性控制

静态设置:即在AndroidManifest.xml 文件中配置screenOrientation属性,如

 android:screenOrientation="landscape" //横屏
 android:screenOrientation="portrait" //竖屏

动态设置:即调用Activity的setRequestedOrientation(@ActivityInfo.ScreenOrientation int requestedOrientation)方法设置screenOrientation属性值
如:

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏

以上两种方法,均可以通过改变screenOrientation属性值的方式配置屏幕方向属性,人为的限制屏幕可自动选择或者锁定横竖屏。只不过动态设置可以通过动态的改变屏幕方向属性值的方式,从而动态的设置屏幕方向。

2.Android横竖屏切换Activity生命周期

关于Android横竖屏切换Activity是否会销毁重建,这个由Activity的configChanges属性控制。当一个配置改变时Activity默认会销毁重建。

为了不必要的麻烦比如视频播放屏幕旋转等,避免重走生命周期就是一个比较好的解决方案:
在AndroidManifest.xml 的activity中设置属性后,Activity就不会销毁重建(不会重新调用各个生命周期),而是回调Activity的onConfigurationChanged方法。如下:

android:configChanges="orientation|keyboardHidden|screenSize"

需要注意的是,第一次切换时onConfigurationChanged方法会回调两次

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //如果需要可以更改布局
        } else {
        //如果需要可以更改布局
            Log.i(this.getClass().getName(), "onConfigurationChanged");
        }
    }

横竖屏辨识

一、在onConfigurationChanged里判断,为了onConfigurationChanged在监听屏幕方向变化有效需要以下条件

(1)AndroidManifest.xml增加权限:

<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>

(2)AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13

(3)在AndroidManifest.xml的Activity里增加:android:configChanges=“keyboard|screenSize|orientation|layoutDirection”

(4)在onConfigurationChanged(Configuration newConfig)进行判断

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //如果需要可以更改布局
        } else {
        //如果需要可以更改布局
            Log.i(this.getClass().getName(), "onConfigurationChanged");
        }
    }

二、因为当屏幕变为横屏的时候,系统会重调用Activity的onCreate方法可以在onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layout xml。

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"); // 竖屏
}

注意:该方法是在AndroidManifest.xml中不设置android:configChanges属性才能重走生命周期

横竖屏切换布局文件设置

如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局

(1)在res目录下建立layout-land和layout-port目录,相应的layout文件名称不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。

(2)在上面横竖屏辨识中,如果横竖屏出现变化,在onCreate()或者onConfigurationChanged()判断方向,就可以在相应的方法中重新setContentView来载入不同的layout xml布局文件

横竖屏切换数据保存与读取

另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏或者视频播放就不会自动重启了。

Activity 横竖屏切换时会回调两个函数 ,如下:

   onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据
   onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据

Activity 数据保存

(1)如果因为系统资源紧张而导致Activity的Destory或者旋转屏幕时被destroyed与Recreated, 系统会在用户回到这个Activity时有这个Activity存在过的记录,系统会使用那些保存的记录数据(instance state)它是一些存放在Bundle对象中的key-value pairs,系统默认使用 Bundle保存信息

(2)为了可以保存额外更多的数据到instance state,要重写写这个回调函数onSaveInstanceState(Bundle outState),系统会在Activity被异常Destory时传递Bundle对象,这样我们就可以增加额外的信息到Bundle中并保存到系统中。若系统在Activity被Destory之后想重新创建这个Activity实例时,之前的Bundle对象会(系统)被传递到你我们activity的

(3)Activity开始stop,系统会调用 onSaveInstanceState(Bundle outState) ,Activity可以用键值对的集合来保存状态信息。这个方法会默认保存Activity视图的状态信息,如在 EditText组件中的文本或 ListView 的滑动位置

Activity 数据恢复

(1)当Activity从Destory中重建,我们可以从系统传递的Activity的Bundle中恢复保存的状态。 onCreate() 与 onRestoreInstanceState() 回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。

(2)由于 onCreate() 方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,我们必须在尝试读取 Bundle 对象前检测它是否为null。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。

(3)也可以选择实现 onRestoreInstanceState() ,而不是在onCreate方法里面恢复数据。 onRestoreInstanceState()方法会在 onStart() 方法之后执行. 系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState() ,因此不需要检查 Bundle 是否为null。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值