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)方法。
    我们就可以在这个方法里面,获取到新的屏幕方向,然后加载对应的布局。具体的代码如下所示:

    @Overridepublic 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类对象。

具体的使用示例如下:

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

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

总结

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

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

更多相关文章

  1. Android(安卓)去掉 ImageButton 的白色背景边框
  2. Android(安卓)wakeLock 分析
  3. Android——消息机制
  4. 【Android】Android(安卓)SDK下载和更新失败的解决方法!!!
  5. Android事件分发机制总结
  6. android 杀掉进程
  7. Android(安卓)禁止响应屏幕翻转
  8. AndroidManifest.xml里面的activity的几个属性简介
  9. 深入理解 Android(安卓)Activity的生命周期

随机推荐

  1. Android ImageView 的scaleType属性
  2. android定时器(Timer,TimerTask)
  3. 安卓,rebuild apk错误解决
  4. Android序列化基础知识
  5. Android构建打包过程
  6. android merge和include简单使用
  7. Android中Activity启动模式launchermode
  8. Android中文API(136) —— GeoCoder
  9. 三个博客和一张关系图,掌握Android WebVie
  10. xml中设置圆角矩形框