博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 横竖屏幕切换
阅读量:2345 次
发布时间:2019-05-10

本文共 3013 字,大约阅读时间需要 10 分钟。

最近在做android 横竖屏幕适配

Android横竖屏要解决的问题应该就两个:一.布局问题;二.重新载入问题。

  1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:

  “unspecified”

  默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.

  “landscape”

  横屏显示(宽比高要长)

  “portrait”

  竖屏显示(高比宽要长)

  “user”

  用户当前首选的方向

  “behind”

  和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)

  “sensor”

  有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。

  “nosensor”

  忽略物理感应器,这样就不会随着用户旋转设备而更改了 ( “unspecified”设置除外 )。

  也可以在Java代码中通过setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);来设置。

  如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局:

  1)在res目录下建立layout-landlayout-port目录,相应的layout文件不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。

  2)通过this.getResources().getConfiguration().orientation来判断当前是横屏还是竖屏然后来加载相应的 xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml.

 if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {  Log.i("info", "landscape");  }  else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  Log.i("info", "portrait");  }

  2. 重新载入问题。如果不需要从新载入,可以在androidmanifest.xml中加入配置 android:configChanges=”orientation”,配置android:configChanges的作用就是如文档所说的:Specify one or more configuration changes that the activity will handle itself. If not specified, the activity will be restarted if any of these configuration changes happen in the system。这样在程序中. Activity就不会重复的调用onCreate()甚至不会调用onPause.onResume.只会调用一个 onConfigurationChanged(Configuration newConfig)。

  1. 如果我在android:configChanges中只设置orientation,他依然会重新加载,只有设置了 orientation|keyboardHidden它才会只调用一个onConfigurationChanged(Configuration newConfig)

  2.当横屏变竖屏的时候,他会调用两次onConfigurationChanged,而竖屏转横屏时他只调用一次onConfigurationChanged,真是太奇怪了。

  如果需要重新载入,则不需要做任何修改。不过如果需要在重新载入过程中保存之前的操作内容或数据,则需要保存之前的数据。然后在activity的 onCreate()中取出来。当然,如此就不能设置android:configChanges()了,否则就不会调用onCreate()方法。那么数据可以保存在哪呢?Android中四种存储方法都可以,另外,还可以用Android为我们提供了 onRetainNonConfigurationInstance()方法来暂时保存数据。

  下面为此举个例子:

  保存临时图片:

  @Override  public Object onRetainNonConfigurationInstance() {  final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];  keepPhotos(list);  return list;  }

  之后便可以在activity的onCreate()函数中实现重新调用临时文件,在代码中需要判断系统是否需要重新加载临时文件。以下是放在OnCreate()函数中加载临时文件的代码:

 private void loadPhotos() {  final Object data = getLastNonConfigurationInstance();  // The activity is starting for the first time, load the photos from Flickr  if (data == null) {  mTask = new GetPhotoListTask().execute(mCurrentPage);  } else {  // The activity was destroyed/created automatically, populate the grid  // of photos with the images loaded by the previous activityfinal LoadedPhoto[] photos = (LoadedPhoto[]) data;  for (LoadedPhoto photo : photos) {  addPhoto(photo);     }   } }

  对于大多数的情况并不需要做如上的操作,所以需要谨慎使用这个行文,毕竟最好的行为也并不适用于所有情况,如果应用的不好反而会给程序带来不必要的麻烦。如果要彻底禁止翻转,可以设置android:screenOrientation的属性为nosensor,如此就可以忽略重力感应带来的麻烦了。

转载地址:http://jmnvb.baihongyu.com/

你可能感兴趣的文章
零基础学Java需要做哪些准备?需要注意些什么呢?
查看>>
有了这份阿里大牛手写630页Java高级面试手册,offer稳了【建议收藏】
查看>>
学习Java,需要学到什么程度,才能出去找工作?
查看>>
2021年Java发展怎么样?现在学了Java技术出来是否还能找到工作?
查看>>
Java程序员面试大厂的技术标准,你达到要求了吗?
查看>>
为什么Java程序员需求量这么大,还会有人找不到合适的工作?
查看>>
过来人对程序员学习Java的10条建议,第2点很重要!
查看>>
大学生如何学好Java?过来人给你7点建议
查看>>
过来人的经验:Java实习生在公司里一般都做什么?
查看>>
Java入门基础知识点整理大放送,推荐收藏
查看>>
如何成为月入25k的高级程序员?建议养成这7个习惯
查看>>
学 Java还是Python, 哪个更好找工作?
查看>>
Java基础知识:如何计算Java对象占用内存大小?
查看>>
一份Java程序员的珍藏书单,请您注意查收
查看>>
全宇宙上最全Java基础知识点归纳(建议收藏)
查看>>
这6类人,最适合做程序员!
查看>>
Java入门基础知识点需要学什么?
查看>>
为什么现在Java程序员要求高?看完这些原因你就明白了!
查看>>
有哪些值得推荐的 Java 练手项目?
查看>>
一文看清:Java的核心技术是什么?
查看>>