Android之屏幕切换使用技巧

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() {
   //保存一个bean
    return new UserBean("yaojt", "1123456", 23);
}

//获取
//在oncreate方法中,获取保存的bean对象
//这里只是获取到NonConfigurationInstances的custom对象,即我们在onRetainCustomNonConfigurationInstance()
//保存的对象
UserBean userBean = (UserBean) getLastCustomNonConfigurationInstance();

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

总结

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

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

你可能感兴趣的:(Android)