JSON

Android之屏幕切换使用技巧

字号+ 作者:H5之家 来源:H5之家 2017-04-22 11:05 我要评论( )

Android之屏幕切换使用技巧 - 沈文泽博客

Android之屏幕切换使用技巧 文章链接: 知识点: activity横竖屏

android:screenOrientation

属性有下述可选值:

横竖屏切换时,加载不同的布局方法
- 准备两套不同的布局,系统会根据横竖屏加载不同布局:
创建两个布局文件夹: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类里面的定义好的参数。

    如果进行了横竖屏的切换,当前的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的生命周期要比较熟悉,才能够比较熟练的在横竖屏切换的时候,做到更好的用户体验。

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

    Tags:android   屏幕切换   orientatio   Android  

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • Json for Java API学习

      Json for Java API学习

      2017-04-16 13:03

    • 在 Android 上使用 XML 和 JSON,第 1 部分: 在 Android 应用程序上研究 JSON 和 XM

      在 Android 上使用 XML 和 JSON,第 1 部分: 在 Android 应用程序上

      2017-04-14 17:02

    • JSON数据解析的实例

      JSON数据解析的实例

      2017-04-14 12:03

    • Android快速开发教程第一季

      Android快速开发教程第一季

      2017-03-29 15:00

    网友点评