android常用功能组件——setRequestedOrientation

本文详细介绍了在Android应用中如何设置和改变屏幕显示方向,包括在配置文件中使用`android:screenOrientation`属性和在代码中调用`setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_XXXX)`的方法,讲解了不同类型的屏幕方向参数如`SCREEN_ORIENTATION_PORTRAIT`、`SCREEN_ORIENTATION_LANDSCAPE`等的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


     在配置文件中可以通过给activity添加属性:android:screenOrientation="xxxx"来设置。

     在程序的onCreate中,在setContentView()之前通过设置setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_XXXX);来设置/改变屏幕显示的方向。其中的XXXX表示不同的类型:

### Android 屏幕旋转处理方式与配置方法 在 Android 开发中,屏幕旋转是一个常见的场景。当设备发生方向变化时,默认情况下 Activity 的生命周期会被触发,即销毁当前实例并创建新的实例。这种行为可能会导致不必要的资源消耗或者数据丢失。因此,开发者可以采取一些措施来优化屏幕旋转的处理。 #### 方法一:通过 `android:configChanges` 防止重建 Activity 可以在 `AndroidManifest.xml` 文件中为特定的 Activity 设置 `android:configChanges` 属性,从而防止因屏幕旋转而导致的 Activity 重建。以下是具体的配置: ```xml <activity android:name=".MySetNewsActivity" android:configChanges="keyboardHidden|orientation|screenSize"> </activity> ``` 此配置表示该 Activity 将自行处理键盘隐藏、方向变化以及屏幕尺寸的变化事件[^1]。需要注意的是,如果目标 SDK 版本高于 API Level 12,则还需要额外声明 `screenSize` 参数以兼容不同屏幕大小的情况[^4]。 #### 方法二:重写 `onConfigurationChanged()` 处理逻辑 一旦设置了 `android:configChanges` 属性,就需要手动覆盖 `onConfigurationChanged(Configuration newConfig)` 方法来进行必要的调整操作。例如更新 UI 布局或其他依赖于屏幕方向的功能模块。 ```java @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 检测当前屏幕方向 if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Toast.makeText(this, "Landscape", Toast.LENGTH_SHORT).show(); } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ Toast.makeText(this, "Portrait", Toast.LENGTH_SHORT).show(); } } ``` 以上代码片段展示了如何检测到不同的屏幕方向,并执行相应的业务逻辑。 #### 方法三:保存和恢复状态 即使不使用 `android:configChanges` 来阻止重建过程,也可以利用系统的回调机制——`onSaveInstanceState(Bundle outState)` 和 `onRestoreInstanceState(Bundle savedInstanceState)` ——来存储重要信息并在必要时恢复它们。 ```java // 当前界面即将被摧毁之前调用 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("key_data", mData); // 存储临时变量mData至Bundle对象中 } // 如果存在已保存的状态则在此处读取回来 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String data = savedInstanceState.getString("key_data"); Log.d(TAG,"Restored Data:"+data); } ``` 这种方法适用于那些希望保留某些动态生成的数据而不影响用户体验的应用程序设计模式下。 #### 方法四:强制指定固定方向 有时为了简化开发流程或是满足特殊需求,可以选择锁定某个页面始终处于某一种显示模式之下(比如只允许横向浏览视频播放器类应用),这可通过如下语句实现: ```java setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 或者 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); ``` 此外还有其他更复杂的自定义选项可供选择取决于具体应用场景的要求[^2]。 #### Framework 层面深入探讨 对于更加底层的理解来说,在Framework层面上涉及到多个组件协作完成整个屏幕转向动画效果呈现等工作流环节。例如从 PowerManagerService 中发起请求最终传递给 WindowManagerService 并由其负责实际物理层面像素映射变换等一系列复杂交互链条构成整体解决方案框架结构图解说明文档可参见官方资料链接地址[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值