最近有个小需求,需要禁止指定的fragment进行横竖屏切换。
由此引出了本文,算是对该需求知识点的一个小结。
首先简单的说下一般横竖屏切换的基本操作。网上的博客大多数都是针对activity做的,即禁止当前activity。至于说横竖屏切换后生命周期的变化或如何解决由于横竖屏切换导致需要保存数据的问题,已有很多前辈高手去写,这里不再累述。确实有需要,请留言,菜鸡会在本文末尾进行补充说明。
针对Activity
方式一:在AndroidManifest.xml中定义
A、AndroidManifest.xml中禁止横竖屏切换实现
要禁止横竖屏切换我们只需在AndroidManifest.xml文件中对应的Activity的标签中添加属性android:screenOrientation即可。属性为android:screenOrientation=" portrait"时表示该Activity只能竖屏显示,属性为android:screenOrientation="landscape"时表示该Activity只能横屏显示。设定android:screenOrientation横竖屏后,将关闭该activity自由切换横竖屏的功能。
补充:
B、AndroidManifest.xml中禁止横竖屏切换时重启Activity实现
要禁止横竖屏切换重启Activity我们只需在AndroidManifest.xml文件中对应的Activity的标签中添加android:configChanges="orientation"属性即可。
我们打出log日志比较下他们的生命周期回调
1、默认情况下生命周期
第一次进入界面
切换成横屏时
切换成竖屏时
2、在AndroidManifest.xml设置Activity标签属性android:configChanges=”orientation”后
第一次进入界面
切换成横屏时
成功了……咦,are you kidding me?别慌……别慌……别慌
注意,重点来了,也是给不负责随便拷贝的哥们儿说一声,请别误人子弟。
自己在5.1手机上调试发现横竖屏切换时,并没有执行onConfigurationChanged()方法,依旧销毁当前Activity并创建新的Activity实例。
搜索发现:这个属性在低版本上是可以起作用。在android 4.0 以上不起作用,必须要加上screenSize,即android:configChanges="orientation|screenSize",好了,我们再试一试
切换成横屏时:
切换成竖屏时:
好了,达到上面的目的了。
至于想了解更多android:configChanges相关属性的哥们儿,请看官方文档,这里不再累述。
方式二:在Activity中定义,禁止横竖屏切换
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)或setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
好了,该Activity的横竖屏禁止生效。
ok,走入我们前文说到的需求点。指定某个fragment禁止横竖屏切换
针对fragment
其核心实现,依然时和针对activity的写法是一样的,不过他的麻烦之处在于对fragment禁止横竖屏切换的时机和释放禁止横竖屏切换的时机。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)或setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
此操作会将他所在的Activity一起给禁止掉横竖屏切换,基于该Activity的fragment也会被禁掉横竖屏切换的功能,这样就与需求不合,所以我们需要寻找一个时机去解除掉禁掉横竖屏切换。
解除的关键代码 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);此解除的关键在于fragment中的调用时机。
好了,大功告成。
这样操作仅会禁止当前的fragment横竖屏切换的功能而不会影响其他fragment界面的横竖屏切换。