我想大部分人应该都知道Android 里面控制Activity的方向,只要在AndroidManifest.xml里面对应的Activity节点加一句
代码语言:javascript复制android:screenOrientation="landscape"(landscape是横屏,portrait竖屏)
我凭这句话混了一年,基本都可以的,但我在实际项目中,发现这招不是万能的了0.0
在项目里面有一个横屏播放视频的Acitivity,我和之前一样设置了android:screenOrientation=“landscape” 到这边都没有问题,后来加了一个需求,点击屏幕上面的”评论”按钮,弹出一个对话框,这个对话框我是用Activity实现的。效果是:竖屏、评论界面占据屏幕的中间一块,周围是半透明的。
神奇的事情出现了,评论窗口弹出后,我发现后面的播放界面居然变成了竖屏。(因为上面说过,这个对话框只暂居了大半个屏幕,周围透明,所以可以看见后面的界面PlayAcitivity)。
看见屏幕切换为竖屏了,我就郁闷了,我明明设置了android:screenOrientation=“landscape”,为什么还切换呢。
后来百度没有找出原因来。我理解是这样的:虽然PlayAcitivity被遮住了,但是依然有一部分可见。而顶部窗口(对话框)是设置为android:screenOrientation="portrait"的,屏幕只有一个,肯定是根据顶部窗口的设置为准。
Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载),怎么使屏幕横竖屏切换时,当前的Activity不销毁呢?
在AndroidManifest.xml中为Activity设置configChanges属性.
代码语言:javascript复制configChanges有如下选项:
1. orientation :屏幕在纵向和横向间旋转;
2. keyboardHidden:键盘显示或隐藏;
3.fontScale: 用户变更了首选的字体大小
4.locale: 用户选择了不同的语言设定;
5. keyboard: 键盘类型变更,例如手机从12键盘切换到全键盘
6. touchscreen或navigation: 键盘或导航方式变化,
如果缺少了keyboardHidden选项,不能防止Activity的销毁,并且在之后提到的onConfigurationChanged事件中只能捕获竖屏变横屏的事件不能捕获横屏变竖屏。
android:onConfigurationChanged实际对应的是Activity里的onConfigurationChanged()方法。
在AndroidManifest.xml中添加上述代码的含义是表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行onCreate()方法,而是直接执行onConfigurationChanged()。如果不申明此段代码,按照Activity的生命周期,都会去执行一次onCreate()方法,而onCreate()方法通常会在显示之前做一些初始化工作。所以如果改变屏幕方向这样的操作都去执行onCreate()方法,就有可能造成重复的初始化,降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。这是需要千万避免的。
需要了解横竖屏切换关键知识
1.在Android设备的横竖屏幕,每一次切换横竖屏其实是在重新创建Activity,Activity会重新走一遍生命周期.从onCreate 到 onDestroy
2.在Activity类里的变量也会重新创建,这点需要注意!
总结
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置屏幕为横屏, 设置后会锁定方向 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置屏幕为竖屏, 设置后会锁定方向 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//方向未定义, 设置后放弃锁定方向
注意,这里的锁定方向意思是指,用户将无法自己改变这个activity的方向. 包括自动切换屏幕的方向传感器.
SCREEN_ORIENTATION_UNSPECIFIED 方向未指定 SCREEN_ORIENTATION_LANDSCAPE 方向横屏 SCREEN_ORIENTATION_PORTRAIT 方向竖屏 SCREEN_ORIENTATION_USER 方向用户 SCREEN_ORIENTATION_BEHIND 方向背后 SCREEN_ORIENTATION_SENSOR 方向传感器 SCREEN_ORIENTATION_NOSENSOR 方向没有传感器 SCREEN_ORIENTATION_SENSOR_LANDSCAPE 传感器横向 SCREEN_ORIENTATION_SENSOR_PORTRAIT 传感器竖向 SCREEN_ORIENTATION_REVERSE_LANDSCAPE 反转横向 SCREEN_ORIENTATION_REVERSE_PORTRAIT 反转竖向 SCREEN_ORIENTATION_FULL_SENSOR 全传感器 SCREEN_ORIENTATION_USER_LANDSCAPE 用户横向 SCREEN_ORIENTATION_USER_PORTRAIT 用户竖向 SCREEN_ORIENTATION_FULL_USER 方向用户 SCREEN_ORIENTATION_LOCKED 方向锁定