Activity横竖屏切换的那些事,Android开发框架

设置屏幕的方向


简介

| 值 | 描述 |

| — | — |

| unspecified | 默认值。系统自动选择屏幕方向 |

| behind | 跟activity堆栈中的下面一个activity的方向一致 |

| landscape | 横屏方向,显示的宽比高长 |

| portrait | 竖屏方向,显示的高比宽长 |

| sensor | 由设备的物理方向传感器决定,如果用户旋转设备,这屏幕就会横竖屏切换 |

| nosensor | 忽略物理方向传感器,这样就不会随着用户旋转设备而横竖屏切换了(”unspecified”设置除外) |

| user | 用户当前首选的方向 |

| reverseLandscape | API 9 以上,反向横屏 |

| reversePortrait | API 9 以上,反向竖屏 |

| sensorLandscape | API 9 以上,横屏,但是可以根据 物理方向传感器来切换正反向横屏 |

| sensorPortrait | API 9 以上,竖屏,但是可以根据 物理方向传感器来切换正反向竖屏 |

| fullSensor | API 9 以上,上下左右四个方向,由物理方向传感器决定 |

| locked | API 18 以上,锁死当前屏幕的方向 |

官网文档地址

第一种

我们可以在AndroidManifest 清单文件里面制定Activity的方向

<activity

android:name=“.view.main.MainActivity”

android:screenOrientation=“portrait”>

这样横竖屏切换的时候不会重新创建Activity

第二种

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


Android:android:configChanges


如果我们不配置configuration ,当 configuration 发生变化的时候,activity会自动处理它。反之,如果我们配置了相应的 configuration,当新的 configuration 发生变化的时候,会回调 Activity 的 onConfigurationChanged() 方法。

下面我们一起来看一下几个常用的值得介绍,其他不常用的hi请自行查阅文档。官网地址:

| 值 | 描述 |

| — | — |

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

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

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

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

android:configChanges 常用配置

在Android 3.2以后,如果我们进行下列的配置 ,这样的话横竖屏不会重新创建Activity,但是会调用 onConfigurationChanged()方法

<activity

android:name=“.view.main.MainActivity”

android:configChanges=“keyboardHidden|orientation|screenSize”

在api 3.2 以前,我们只需这样配置即可,android:configChanges=”keyboardHidden|orientation”。

<activity

android:name=“.view.main.MainActivity”

android:configChanges=“keyboardHidden|orientation”

小结

当我们进行了上述的配置,

  • 竖屏 》 横屏 onConfigurationChanged()方法会调用一次

  • 横屏 》 竖屏 onConfigurationChanged()方法也会调用一次

因此我们通常可以进行相应的处理

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

// 加入横屏要处理的代码

} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

// 加入竖屏要处理的代码

}

}

如果我们同时设置了 android:configChanges=”keyboardHidden|orientation|screenSize” 和 android:screenOrientation=”portrait”,那又会是怎样的呢?

如果我们打开系统的自动旋转屏幕,旋转屏幕,系统不会发生变化,也不会调用 Activity 的 onConfigurationChanged 方法。

当我们手动调用 setRequestedOrientation() 方法去改变屏幕的方向的时候,还是会调用 onConfigurationChanged 方法的


扩展

设置全屏模式

// 去掉ActionBar

requestWindowFeature(Window.FEATURE_NO_TITLE);

// 设置全屏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

在实际项目中,我们通常会固定我们应用的屏幕方向,只对一些特定的需要切换屏幕的Activity做处理,那我们如何统一设置屏幕的方向呢?

  • 第一种方法,复制张贴,在AndroidManifest清单文件里面的每一个Activity标签增加如下标签。

<activity android:name=“.MainActivity”

android:screenOrientation=“portrait”

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档,如果有需要的朋友可以私信我【面试】免费领取

点击这里领取Android面试资料汇总

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)*
[外链图片转存中…(img-YdVf9gV2-1710319810774)]

最后

考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档,如果有需要的朋友可以私信我【面试】免费领取

点击这里领取Android面试资料汇总

[外链图片转存中…(img-MjOxDZeV-1710319810775)]

[外链图片转存中…(img-UAWb3OyA-1710319810775)]

喜欢的朋友可以关注、转发、点赞 感谢!

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值