Android屏幕旋转问题

Android Activity横竖屏切换具体使用

Android面试中关于生命周期肯定会问到Activity在旋转时生命周期的变化,基本上大家都知道如果不设置

android:configChanges="orientation|keyboardHidden|screenSize"

Activity会重新执行一遍生命周期,也就是Activity会销毁再Resume。
如果设置了上述属性,那么横竖屏切换的时候Activity的生命周期不再变化,而是走onConfigurationChanged()回调。

面试这个有啥用吗?我觉得没啥用。下面具体看看开发中横竖屏切换的各种情况吧。

1. 默认状态

默认状态指的是什么都不设置,切换横竖屏重新执行生命周期的情况。
写demo的时候我经常会这么写,但是在实际项目中如果这么写的话在性能调优的时候一定要优化掉。
问题就在于重新走生命周期,一个Activity正常回退再进入的时候是走onPause()->OnStop()->OnStart()->OnResume()。通常在Activity OnCreate()的时候我们会写一个Init()方法来初始化一些对象,如果横竖屏切换的时候生命周期重新走了,那么这些对象都会被销毁重新创建,那么这些对象的状态就需要在saveInstanceState中取保存,重建时再重新恢复。如果旋转的时候正在做网络请求,这次请求等于白搭。再加上Activity重建消耗的资源,显然如果对横竖屏不做处理会浪费资源,而且Activity销毁重建的过程也会使得UI看起来不连贯,用户体验不好。

2.禁止屏幕旋转

有些UI界面当只适合竖屏或者横屏,那么就需要禁止屏幕旋转。比如微信的聊天界面,界面的主体是一个list,这个list应该尽可能多的显示数据,如果允许切换为横屏,那么每个Item会被拉地很长,真个屏幕只能显示几条数据。很显然这不是用户所期望的效果,而且微信的使用场景需要考虑到很多时候用户是在床上侧卧着玩手机的,如果手机开启了自动旋转,那么即使手机没有横过来也会显示成横屏,这样极大的影响了用户体验。效果如下图。
在这里插入图片描述
这时候需要在清单文件中设置activity的属性

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

3. 屏幕旋转不刷新Activity

这个就是一开始提到的

这个属性的意思就是在提到的条件被触发的时候调用configChanges的逻辑
大部分Activity都是使用了这个属性避免Activity重建

4. 使用多个layout

在上述第三点的介绍中可以知道,当设置

android:configChanges="orientation|keyboardHidden|screenSize"

之后旋转屏幕就不会重建Activity了,而是会走onConfigurationChanged。
这个时候还可以重写Activity的onConfigurationChanged()方法用来给横竖屏加载不同的layout。
注意setContentView之后需要重新findViewById。这个是我偷懒了,其实用inflate更好。

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        Log.d("Main2Activity", "onConfigurationChanged");
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏
            Log.d("Main2Activity", "横屏");
            setContentView(R.layout.activity_main2_land);
            mListView = findViewById(R.id.main_list_land);
            mListView.setAdapter(adapter);

        } else {//竖屏
            setContentView(R.layout.activity_main2);
            Log.d("Main2Activity", "竖屏");
            mListView = findViewById(R.id.list_view);
            mListView.setAdapter(adapter);
        }
    }

竖屏效果:
在这里插入图片描述

横屏效果:

扫描二维码关注公众号,回复: 8488483 查看本文章

在这里插入图片描述
在某些页面下比如音乐播放等或者非一个列表的UI界面,我认为横竖屏加载2套布局是最优方案,当然代价就是需要设计2套UI,而且可能用户几乎不用横版UI。

5. 动态更改屏幕方向

上面的几种情况都是写死了横竖屏,需要用户开启手机自动旋转并且旋转手机后才会触发。有些时候我们可以在代码中动态改变屏幕的方向,帮助用户直接切换横竖屏。比如在播放视频的时候,视频的比例显然和手机横屏的比例相近,当用户选择全屏播放的时候,可以自动切换到横屏。
核心的方法是:

getRequestedOrientation();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置为竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置为横屏

注意在使用getRequestedOrientation()判断当前横竖屏状态时,需要在清单文件中先指定一个orientation,否则可能会报空。

android:screenOrientation="landscape"//竖屏
发布了17 篇原创文章 · 获赞 9 · 访问量 1612

猜你喜欢

转载自blog.csdn.net/weixin_44666188/article/details/103842286