Android之屏幕切换使用技巧(setRequestedOrientation)

文章链接:

知识点:

  1. android:screenOrientation及属性介绍;
  2. 屏幕切换时加载不同布局;
  3. setRequestedOrientation手动设置布局方向;
  4. 设置屏幕布局注意的点;
  5. 切换屏幕布局保存页面状态的方法onRetainCustomNonConfigurationInstance;
  6. 新名词记录{onRetainCustomNonConfigurationInstance():屏幕切换时保存页面状态的新方法;onRetainNonConfigurationInstance():旧的保存页面状态方法}

activity横竖屏

android:screenOrientation

属性有下述可选值:

  • unspecified:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
  • landscape:横屏显示
  • portrait:竖屏显示
  • user:用户当前首选的方向
  • behind:和该Activity下面的那个Activity的方向一致
  • sensor:由物理的感应器来决定,如果用户旋转设备这屏幕会横竖屏切换
  • nosensor:忽略物理感应器,这样就不会随着用户旋转设备而更改了(“unspecified”设置除外)

横竖屏切换时,加载不同的布局方法
- 准备两套不同的布局,系统会根据横竖屏加载不同布局:
创建两个布局文件夹:layout-land横屏,layout-port竖屏,比如文件名为main.xml,分别放到两个文件夹中去,当执行oncreate()方法的时候,系统就会自行判断应该要加载哪一个文件夹下面的main.xml布局。

  • 在代码中进行判断,一般是在onCreate()方法中加载布局文件的时候,对横竖屏的状态做下判断,代码如下所示:

        if (Configuration.ORIENTATION_LANDSCAPE == this.getResources().getConfiguration().orientation) {setContentView(R.layout.layout_land);//设置横屏} else if (Configuration.ORIENTATION_PORTRAIT == this.getResources().getConfiguration().orientation) {setContentView(R.layout.layout_port); //设置竖屏}
  • 手动设置横竖屏

    出了随系统或者是传感器或者是用户而进行横竖屏切换,我们也可以自己调用系统提供的方法进行横竖屏的切换,比如我们在uc里面进行看视频的时候,UC的视频播放器会自动的进行横屏。手动调用的时候,在Androidmanifest文件对应activity文件下声明的screenOrientation就会失效了。调用的就是下面的方法。

    //定义为竖屏
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    需要的参数是在ActivityInfo类里面的定义好的参数。

    • SCREEN_ORIENTATION_UNSPECIFIED
    • SCREEN_ORIENTATION_LANDSCAPE
    • SCREEN_ORIENTATION_PORTRAIT
    • SCREEN_ORIENTATION_USER
    • SCREEN_ORIENTATION_BEHIND
    • SCREEN_ORIENTATION_SENSOR
    • SCREEN_ORIENTATION_NOSENSOR
    • ···

    如果进行了横竖屏的切换,当前的activity会被销毁,并且重新创建一个,因为此时页面的宽高都已经改变了,所以需要重新测量和布局,就需要销毁重建。此时,activity调用的周期方法是:onPause()-> onStop()-> onDestory()-> onCreate()->onStart()->onResume()。结合页面保存的对象,在onCreate()/onResume()方法里面获取到保存的对象,然后重写将值设置到切换了屏幕方向的新布局去。

    但是有时候,横屏模式并不是说屏幕的宽度一定比高度要长,竖屏也不一定高度比宽度要长。所以,为了更加保险,我们可以不需要根据屏幕的方向来显示,而是根据屏幕的实际宽高来进行。代码如下所示:

        Display display = this.getWindowManager().getDefaultDisplay();int width = display.getWidth();int height = display.getHeight();if (width > height){//横屏,加载横屏布局}else {//竖屏,加载竖屏布局}
  • 注意的问题

    1、在Androidmanifest文件的< activity >节点下面,设置了android:screenOrientation=”portrait/landscape/sensor”等属性,那么屏幕就确定不会再改变了。除非手动调用setRequestedOrientation()方法,同理,调用此方法之后设置的屏幕方向的属性也是确定的了。

    2、在横竖屏切换的时候,销毁重建activity会消耗资源,如果没有保存屏幕的数据,重建之后屏幕的数据又得重新设置,用户体验就不好了。在activity的节点下面还有这个属性:android:configChanges=”orientation|keyboardHidden”。如果我们设置了以上两个属性,那么在切换屏幕方向的时候,不再是销毁重建activity,而是会调用onConfigurationChanged(Configuration newConfig)方法。
    我们就可以在这个方法里面,获取到新的屏幕方向,然后加载对应的布局。具体的代码如下所示:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);switch (newConfig.orientation) {case Configuration.ORIENTATION_PORTRAIT:break;case Configuration.ORIENTATION_LANDSCAPE:break;default:break;}
    }

补充一点

关于在横竖屏切换,activity被销毁和重新创建的情况下,我们需要保存页面上的一些数据,待到切换完成之后,再将数据重新放到页面上去,给用户一个无缝的体验。

有的人说,可以使用onRetainNonConfigurationInstance()方法进行数据的保存,但是系统是推荐不重写这个方法的,推荐使用的是一个新的方法:onRetainCustomNonConfigurationInstance(),对应的获取保存的对象的方法是:getLastCustomNonConfigurationInstance()。

在跟踪源码之后发现,信息都是用NonConfigurationInstances类进行保存的。这个位于FragmentActivity里的内部静态类里面有3个参数,Object:我们保存的对象,FragmentManagerNonConfig:在activity重建事件中,保存fragment的实例,SimpleArrayMap:一个实现ArrayMap接口类的用于保存键值对的类,此内部静态类里面放入的之时LoaderManager类对象。

具体的使用示例如下:

//保存
@Override
public Object onRetainCustomNonConfigurationInstance() {//保存一个beanreturn new UserBean("yaojt", "1123456", 23);
}//获取
//在oncreate方法中,获取保存的bean对象
//这里只是获取到NonConfigurationInstances的custom对象,即我们在onRetainCustomNonConfigurationInstance()
//保存的对象
UserBean userBean = (UserBean) getLastCustomNonConfigurationInstance();

注意:
如果在没有重写onRetainCustomNonConfigurationInstance()方法保存对象,那么利用getLastCustomNonConfigurationInstance()方法获取的是一个null值。

总结

对于横竖屏,还是比较简单的,但是也是比较难把握的一个知识点,这就要求我们对于activity的生命周期要比较熟悉,才能够比较熟练的在横竖屏切换的时候,做到更好的用户体验。

以上就是所有内容,如有任何问题,请及时与我联系,谢谢!

Android之屏幕切换使用技巧相关推荐

  1. android 横竖屏幕切换

    Android开发中,大多APP可能根据实际情况直接将APP的界面方向设死了,或竖屏或横屏.但是,我们还是会遇到横竖屏切换的功能需求,不管是通过物理重力感应触发,还是用户手动触发.所以,我们有必要去弄 ...

  2. android 横竖屏幕切换,Android 横竖屏切换总结

    一.Android切换横竖屏 应用的横竖屏设置 应用的横竖屏设置主要是通过Activity的screenOrientation属性控制,属性值如下: 主要有以下两种方式设置screenOrientat ...

  3. android ViewFlipper屏幕切换

    大家好,今天给我将介绍ViewFlipper屏幕切换,屏幕切换指的是在同一个Activity内屏幕间的切换,最常见的切换例如一个系统设置页面:一个个性化设置页面等.不说废话,直接看代码. 1.建立工程 ...

  4. Android的屏幕切换动画—左右滑动切换

    预备知识: 在使用自定义视图的时候,对触屏事件的处理是比不可少的,有能力的可以自己写代码处理,这样更加的灵活.如果不想这么麻烦,Android提供了一个手势监听类GestureDetector,可以供 ...

  5. Android 横竖屏幕切换(layout-land和layout-port)

    1.首先通过以下语句设置Activity为无标题和全屏模式: 1 // 设置为无标题栏 2 requestWindowFeature(Window.FEATURE_NO_TITLE); 3 4 // ...

  6. Android中焦点切换的技巧

    [欢迎浏览和转载 Canon_Lee 的原创博客] [http://blog.csdn.net/ljn951/article/details/46897281] [我写文章写得时候会尽量写得通俗和基础 ...

  7. Android 横竖屏幕切换监听

    工作中用到播放视频时,需要横屏将视频全屏播放,所以需要监听屏幕的横竖屏切换事件. @Overridepublic void onConfigurationChanged(Configuration n ...

  8. Android (滑动屏幕切换图片的实现)

    一.首先实现界面部分 代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout x ...

  9. android壁纸和手机屏幕之间要怎么对应,安卓Android手机屏幕壁纸分辨率选择技巧...

    安卓Android手机屏幕壁纸分辨率选择技巧 现在使用安卓手机的人好多了,一个好的手机壁纸自然是大家的追求,那么要怎么挑选适合自己安卓手机的手机壁纸呢~登博教程小编来教你挑选吧~ 大家先看看对应的壁纸 ...

最新文章

  1. build_transformer_model如果不返回keras的bert模型返回的是什么?
  2. KDTable的列绑定F7控件方法
  3. Java编程入门(2.1):基础Java应用程序
  4. nodejs之日志管理
  5. leetcode 628. Maximum Product of Three Numbers | 628. 三个数的最大乘积(Java)
  6. bootstraptable导出excel独立使用_使用 EasyPOI 优雅导出Excel模板数据(含图片)
  7. docker 设置 jvm 内存_是否值得付费?Oracle,Open JDK等四大JVM性能全面对比
  8. a lt b lt c c语言描述,《数据结构与算法分析――c语言描述》读后笔记 4
  9. js问题集锦~持续更新
  10. mfc 如何判断excel软件是否打开_如何从无到有地搭建一套完整的测试系统(上)...
  11. Angular实现购物车计算
  12. Python的静态类型之旅
  13. 微信小程序模板消息(带流程图)
  14. 统计学第一类错误和第二类错误
  15. IDEA如何从断点里获取对象所有数据(数据量很大且不好Ctrl+C)
  16. 为什么智能手机中被撕的永远是华为!
  17. 抖音短视频流量获取攻略,掌握好这些一定可以出爆款
  18. win10ftp服务器上传文件时提示报错,win10 ftp服务器 无权限问题
  19. PS 考试案例 03笔记
  20. 利用算子求解图像梯度

热门文章

  1. linux没有i18n文件,修改linux默认语言i18n
  2. 360奇安信和SonarQube漏洞及bug修改
  3. 免费接口测试-仅供测试专用
  4. SOLIDWORKS 2023 新功能亮点:SW Simulation接触的惩罚刚度控制
  5. 深入理解TCP三次握手四次挥手
  6. 用python绘制一个(x^2/16)+(y^2/25)-(z^2/36)=-1的双叶曲面方程并保存
  7. Visual Studio(管理代码工具)如何使用
  8. 清华计算几何大作业思路分析和代码实现
  9. 【Python】6.类——面向对象的编程
  10. 基于PHP+MYSQL+人才管理系统设计与实现