Android平板旋转至横屏时如何让应用保持竖屏显示?
实现平板横屏时应用保持竖屏样式居中显示的方案
核心实现逻辑:不强行固定系统屏幕方向,允许系统响应旋转操作,仅在应用层调整内容的显示尺寸和方向
第一步:修改Manifest配置
找到对应Activity的配置项,不要设置android:screenOrientation="portrait",添加配置变更监听避免旋转时Activity重建:
<activity android:name=".YourTargetActivity" android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize" android:windowBackground="@drawable/your_background_or_transparent" />
如果需要两侧显示系统壁纸,把windowBackground属性设为透明即可。
第二步:监听方向变化,动态调整窗口尺寸
重写Activity的onConfigurationChanged方法,横屏时调整窗口为竖屏比例居中显示,竖屏时恢复全屏即可:
Kotlin 示例代码
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val windowMetrics = windowManager.currentWindowMetrics val maxBounds = windowMetrics.bounds val screenWidth = maxBounds.width() val screenHeight = maxBounds.height() if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏时设置窗口为竖屏比例,这里取9:16常规竖屏比例,可自行调整 val windowLayoutParams = window.attributes windowLayoutParams.width = (screenHeight * 9/16).toInt() windowLayoutParams.height = WindowManager.LayoutParams.MATCH_PARENT windowLayoutParams.gravity = Gravity.CENTER window.attributes = windowLayoutParams // 强制内容保持竖屏方向,不随系统旋转 requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } else { // 竖屏时恢复全屏显示 val windowLayoutParams = window.attributes windowLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT windowLayoutParams.height = WindowManager.LayoutParams.MATCH_PARENT window.attributes = windowLayoutParams // 恢复方向自动检测,监听下一次旋转操作 requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR } }
效果说明
实现后效果和你提到的YouTube Studio app完全一致,横屏时应用内容保持竖屏比例居中显示,两侧未占用区域展示你设置的窗口背景或系统壁纸,示例效果如下:
兼容注意事项
- Android 12及以上系统可搭配Jetpack WindowManager使用,可完美适配折叠屏等多形态设备
- 多页面统一生效可把上述逻辑封装到BaseActivity中全局处理
- 需要完全禁止内容旋转可在根布局添加
android:rotation="0"做双重保障
内容的提问来源于stack exchange,提问作者Rishin Ali
相关产品推荐
相关产品推荐

