`
ping8080
  • 浏览: 59023 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

应用横竖屏关系

阅读更多

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-land和layout-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()方法来暂时保存数据。

下面为此举个例子:

保存临时图片:

  1. @Override
  2. public Object onRetainNonConfigurationInstance() { 
  3. final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos]; 
  4.     keepPhotos(list); 
  5. return list; 

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

  1. private void loadPhotos() { 
  2. final Object data = getLastNonConfigurationInstance(); 
  3.  
  4. // The activity is starting for the first time, load the photos from Flickr
  5. if (data == null) { 
  6.         mTask = new GetPhotoListTask().execute(mCurrentPage); 
  7.     } else { 
  8. // The activity was destroyed/created automatically, populate the grid
  9. // of photos with the images loaded by the previous activity
  10. final LoadedPhoto[] photos = (LoadedPhoto[]) data; 
  11. for (LoadedPhoto photo : photos) { 
  12.             addPhoto(photo); 
  13.         } 
  14.     } 

对于大多数的情况并不需要做如上的操作,所以需要谨慎使用这个行文,毕竟最好的行为也并不适用于所有情况,如果应用的不好反而会给程序带来不必要的麻烦。

如果要彻底禁止翻转,可以设置android:screenOrientation的属性为nosensor,如此就可以忽略重力感应带来的麻烦了。不过不知道为什么,在模拟器上不管用,听别人说在真机上是正确的,我没有真机,等有了真机再试试看。

 

 

 

 出至:http://www.zmkm.info/?p=100

分享到:
评论

相关推荐

    android 2.2 中横竖屏切换管理方案

    在Android 2.2系统中,横竖屏切换的管理主要涉及到设备的传感器技术,特别是重力感应器,以及系统如何根据这些传感器的数据调整屏幕布局。这个过程的关键在于理解布局方式、角度阈值和旋转映射关系。 首先,我们要...

    android横竖屏切换和自适应屏幕

    在Android应用开发中,横竖屏切换和屏幕自适应是两个关键的概念,它们关系到应用程序在不同设备和屏幕尺寸上的用户体验。以下是对这两个主题的详细解释: **横竖屏切换** 1. **屏幕方向检测**:Android系统可以...

    安卓app开发项目-关于自适应屏幕方向和大小的一些经验(源码).zip

    对于屏幕方向的处理,Android应用默认支持横竖屏切换,但在某些情况下,可能需要限制或固定应用的方向。这可以通过在AndroidManifest.xml中对标签添加android:screenOrientation属性来实现。例如,设置为"portrait...

    ios-横竖屏.zip

    总之,处理iOS应用的横竖屏切换涉及对`UIDevice`的监控、`UIViewController`的属性设置、屏幕方向的通知响应,以及使用Auto Layout和Size Classes进行界面布局。理解这些知识点并熟练运用,能够帮助你构建出对用户...

    iOS8开发技术(Swift 版)【第3季】__屏幕适配详

    了解iOS8中的自动横竖屏规则以及如何在不旋转屏幕的情况下强制改变方向是十分必要的。 #### 六、传统布局与AutoLayout 传统的布局方式通常依赖于固定的位置和大小,这种方式在屏幕尺寸变化较大的情况下容易出现...

    android自适应屏幕demo

    这对于自适应布局非常有效,特别是在横竖屏切换时。 5. **ConstraintLayout**:Google推出的先进布局工具,它允许视图之间的约束关系基于相对位置,而非固定的像素值。ConstraintLayout可以轻松实现复杂的布局,...

    android系统如何自适应屏幕大小

    是指屏幕上有横竖各有多少个像素 1.2屏幕尺寸 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 android将屏幕大小分为四个级别(small,normal,large,and extra large)。 1.3屏幕...

    安卓屏幕适配必须资源.rar

    5. **支持横屏和竖屏**:通过在`res/layout-land`目录下创建横屏布局文件,可以实现横竖屏之间的适配。 6. **使用主题和样式**:在`styles.xml`文件中定义全局的主题和样式,可以统一应用的视觉效果,减少对具体...

    IOS应用源码之【类库与框架】MGSplitViewController for iPad.rar

    3. **测试和调试**:在实际应用中,需要充分测试横竖屏切换、设备旋转等场景,确保视图控制器的行为符合预期。 4. **性能优化**:虽然MGSplitViewController提供了许多便利,但过度依赖自定义布局可能导致性能问题...

    关于自适应屏幕方向和大小的一些经验.zip

    - 通过Java代码或Kotlin的扩展函数动态调整布局元素,如根据屏幕宽度计算列数,或者在横竖屏切换时调整布局结构。 8. **使用Android Jetpack组件** - Android Jetpack中的 Coil 或 Glide 图片加载库能自动处理...

    ucgui 优化

    本文将重点介绍如何针对STM32平台对UCGUI进行优化,特别是提升屏幕刷新率和支持横竖屏切换等功能。 #### 二、速度优化 ##### 1. 使用寄存器级操作替换标准库函数 为了提高性能,作者选择直接使用寄存器级操作来...

    应用源码之VideoViewSample2.zip

    在VideoViewSample2中,我们可能会看到如何监听屏幕方向变化,根据横竖屏切换调整VideoView的布局参数,以实现全屏播放。 5. 自定义事件监听: 为了获取视频播放状态的反馈,开发者通常会添加OnPreparedListener、...

    一个简单的层管理.zipIOS应用例子源码下载

    Size Classes则允许开发者为不同类型的设备和横竖屏指定不同的布局。 此外,`UIStackView`是iOS9引入的新特性,它简化了多个视图水平或垂直堆叠的布局。通过UIStackView,开发者可以方便地调整子视图的排列、间距和...

    搞定Android适配问题

    通过在`AndroidManifest.xml`中指定activity的屏幕方向,或者在代码中动态调整布局,可以确保应用在横竖屏间平滑切换。 8. **适配不同分辨率**:为不同dpi(像素密度)的设备提供不同的图片资源,如ldpi、mdpi、...

    FragmentDemo

    在Android应用开发中,Fragment是Android SDK...通过FragmentDemo项目,开发者可以学习到如何在Android应用中有效地利用Fragment创建灵活多样的UI结构,同时掌握处理横竖屏切换时的保存状态策略,提升应用的用户体验。

    Android高级应用源码-关于Frangment 的实现 仿网易.zip

    它允许开发者将界面拆分为更小、可重用的部分,这样可以更好地管理UI和逻辑,尤其是在横竖屏切换时保持状态。 1. **Fragment的基本概念**:Fragment是一个可以添加到Activity中的UI片段,它有自己的生命周期和回调...

    移动设备开发与设计-网上商城

    此外,还需要考虑横竖屏切换、不同密度屏幕的资源适配。 “虚拟数据库”可能是指SQLite,它是Android内置的关系型数据库系统,适用于存储应用数据。在开发网上商城应用时,SQLite可以用来存储商品信息、用户订单等...

    swift-BAGridView支付宝首页九宫格布局封装

    4. **响应式布局**:支持屏幕尺寸的变化,能在不同设备上(如iPhone、iPad)保持良好的显示效果,适应横竖屏切换。 5. **简单易用**:通过简单的初始化和数据源方法,开发者可以快速地将BAGridView集成到自己的项目...

Global site tag (gtag.js) - Google Analytics