数对先是横还是竖是先横或竖还是先竖后横?

(老样子图片啥的详细文档,鈳以下载后观看 )

Android手机或平板都会存在横竖屏切换的功能通常是由物理重力感应触发的,但是有时候也不尽然通常在设置里面我们可鉯对手机的横竖屏切换进行关闭,操作界面如下

只需要点击下“屏幕旋转”按钮就可以关闭横竖屏切换了

一、禁止APP内横竖屏切换

上述设置更改的是整个手机的横竖屏切换,当手机没有关闭横竖屏切换功能时系统一旦触发横竖屏切换,缺省状态下当前活动的App的界面就会進行横竖屏切换,由于横竖屏的界面尺寸等参数不同很多软件在设计和开发中为了避免横竖屏切换时引发不必要的麻烦,通常需要让App禁圵掉横竖屏的切换这就需要通过在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。

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

"user":用户当前首选的方向

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

"nosensor":忽略物理感应器,这样就不會随着用户旋转设备而更改了("unspecified"设置除外)

则无论手机如何变动,拥有这个属性的activity都将是竖屏显示

上述修改也可以在Java代码中通过类似洳下代码来设置

二、APP的横竖屏切换可以手动触发吗

由上面描述可知,当android:screenOrientation为默认值"unspecified"或"sensor"等时就会有系统根据设备的旋转情况来触发横竖屏的切换,那么有没有方法我们手动在程序中触发横竖屏的变换呢显然上面为我们提供的setRequestedOrientation就是系统提供的一个入口,下面我们给出一个按键嘚方式来触发的案列:

需要注意的是手动调用时,无视AndroidManifest中关于screenOrientation的设置;另外上述代码中的onConfigurationChanged要被调用到也是需要条件的在这里,只给代碼不做讨论,后面再给出一个相关的补充说明

三、重启Activity的横竖屏切换

onCreate->onStart->onResume操作,从而销毁原来的Activity对象创建新的Activity对象,这是因为通常情况丅软件在横竖屏之间切换界面的高宽会发生转换,从而可能会要求不同的布局具体的布局切换可以通过如下两种方法来实现:

2)假如咘局资源是不一样又不按照如上设置,则需要通过java代码来判断当前是横屏还是竖屏然后来加载相应的xml布局文件(比如mainP为竖屏mainL为横屏)因為当屏幕变为横屏的时候,系统会重新呼叫当前Activity的onCreate方法,你可以把以下方法放在你的onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layout xml。

上面呮是对布局切换做了描述实际上由于重启Activity在未加处理的情况下必然导致数据的丢失和重新获取,这样用户体验会非常差为此就要在切換前对数据进行保存,切换重启后对数据进行恢复具体操作的步骤如下:

四、非重启Activity的横竖屏切换

虽然重启Activity为我们提供了保存数据和读取数据的方式,但是如此一来程序会显得有些繁琐所以有时候程序员往往就不想让Activity重启,Android也为我们提供了解决方案就是通过onConfigurationChanged拦截横竖屏变换,从而进行必要的重新布局和切换操作操作步骤如下:

关于configChanges的详细描述,后面有个简单补充章节这里不做过多展开。

当然有时候连布局都不用更改的话就可以直接对原有控件进行调用操作了,比如:

需要注意的是onConfigurationChanged函数中只能获得横竖屏切换后的参数,在该函數中获取不到新的Layout和控件的尺寸位置信息如果要处理尺寸和位置信息,必须通过消息异步或者延时调用下面是一个App在横竖屏切换时需偠重新设置popupWindow位置的代码:

虽然上面没有看到对布局的显式调用进行重新布局,照理控件的对象没有被销毁但是控件在横竖屏切换时应该昰需要进行重新layout和measure,然后再进行重绘的否则不会引发弹出框位置的变化,至于如何调用重新layout、measure和Draw操作在这里就不多展开了。

IMSI移动台的國家代码(MCC)发生变化——一个SIM被探测到并且更新MCC

IMSI移动台的网络代码(MNC)发生变化——一个SIM被探测到并且更新MNC

区域发生变化——用户选择叻一个文本需要显示的新语言

触摸屏发生变化(这个通常不会发生。)

键盘类型发生变化——例如:用户插入了外接键盘

键盘的可访問性发生变化——例如:用户发现了硬件键盘。

导航类型(轨迹球或dpad)发生变化(通常不会发生。)

屏幕布局发生变化——这个会导致顯示不同的Activity

字体缩放因子发生变化——用户选择了新的字体大小。

当UI模式发生改变的时候——当用户放置设备到桌子或/汽车或夜间模式妀变的时候可以引起UI模式变化阅读UiModeManager。在API级别8时引入

屏幕方向发生变化——用户旋转了屏幕。注意:如果应用程序的目标API级别是13或更高(通过属性minSdkVersion和属性targetSdkVersion声明)你也需要声明配置项screenSize,因为这将在设备选择肖像和屏幕方向时发生改变

当前可用屏幕大小发生变化。这代表┅个当前可用大小的变化和当前的比率相关,因此当用户选择不同的画面和图像会发生变化。然而如果你的程序目标API级别是12或更低,你的Activity总是会自己处理这个配置变化(这个变化不会引起Activity的重启甚至在Android 3.2或更新的设备上)。在API级别13里加入的

物理屏幕大小的变化。不管方向的变化仅仅在实际物理屏幕打包变化的时候,如:外接显示器这个配置项的变化引起在smallestWidth configuration里的变化。然而如果你的程序目标API级別是12或更低,你的Activity将自己处理这个变化(这个变化不会引起Activity的重启甚至在Android 3.2或更新的设备上)在API级别13里加入的。

布局方向变化例如书写方式从左向右(LTR)转换为从右向左(RTL)

从上述这个表我们可以看到除了横竖屏,包括语言、网络、键盘和外设等变化都可以被onConfigurationChanged函数监控到具体的内容和释义还是查看官方英文文档吧,详见如下链接

结合网上的整理小结跟这几配置相关的情景:

1、不设置Activity的android:configChanges时,切屏会重新調用各个生命周期切横屏时会执行一次,切竖屏时会执行两次(我在三星4.0设备上发现切横屏和竖屏都是执行一次而并非这里说的有执荇两次的情况,不知道是否以前版本手机会这样);

在上述(二)对于手动触发横竖屏切换的时候,我们用到了setRequestedOrientation那时只是简单做了下演示,后来发现还是需要做下补充说明的:

首先在非重启Activity模式下

手动调用setRequestedOrientation之后假如会引发横竖屏切换(即请求的横竖屏要求与当前的横豎屏情况不一致,就会引发切换)那么会立即调用onConfigurationChanged函数;假如不会引发横竖屏切换(请求前后一致),那么也就不会调用到onConfigurationChanged函数

这个掱动调用setRequestedOrientation的地方也可以在Activity中的任何地方,即也可以在onConfigurationChanged中调用但是一旦指定为横屏或竖屏完成这个变换之后,后面不论屏幕如何进行怎么翻转变化都不会再触发横竖屏切换了,也即等同于在manifest中设置了android:screenOrientation属性为横屏或竖屏如果要恢复为响应横竖屏随物理传感器设备变换,那麼就需要手动调用类似如下代码进行恢复:

手动调用setRequestedOrientation发出横竖屏设定请求之后假如需要进行横竖屏切换(即请求前后横竖屏状态不一致),则会对Activity进行销毁并重启;假如不需要需要进行横竖屏切换则Activity维持现状不变;

手动调用setRequestedOrientation一次,完成变换之后也跟上面非重启一样,楿当于在manifest中设置了android:screenOrientation属性为横屏或竖屏要想恢复也需要重新调用类似上面非重启的调用。

在这样一个原理下就有了对如下一种需求的解決方案:

让App启动的时候是横屏的话就横屏表示,纵屏的话就纵屏表示然后手机切换横竖屏就不能用了该怎么解决呢?

网上给出了一个例孓代码这里就不做摘抄了,有兴趣可以试一下然后对比一下人家的实现方式,具体见如下链接

另外再给出几个我做整理时参考的帖子觉得对我帮助很大,分别如下

Android横屏竖屏切换的问题(一个总结帖还是不错的)

解决Android手机屏幕横竖屏切换(一个真实测试过的小结)

Android 处悝横竖屏切换事件

}

曾经遇到过一个面试题让你写絀横屏切换竖屏Activity的生命周期。现在给大家分析一下他切换时具体的生命周期是怎么样的:

1、新建一个Activity并把各个生命周期打印出来

2、运行Activity,得到如下信息

4、再按crtl+f12切换成竖屏时发现打印了两次相同的log

6、再执行步骤4,发现不会再打印相同信息但多打印了一行onConfigChanged

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期切横屏时会执行一次,切竖屏时会执行两次


总结一下整个Activity的生命周期

}

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

在数对先是横还是竖中先写竖还是先写横?

拍照搜题秒出答案,一键查看所有搜题记录

}

我要回帖

更多关于 数对先是横还是竖 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信