Android中使用Jetpack Compose如何正确获取当前屏幕方向?
Jetpack Compose 正确读取屏幕方向的方案
问题核心原因
你之前的写法都是一次性读取静态值,没有和Compose的重组监听机制绑定,同时requestedOrientation本身代表的是应用主动设置的朝向锁定值,而非设备当前实际朝向,天然不会随设备旋转更新,所以无法拿到变化后的数值。
方案1:仅需判断横竖屏(最简洁)
直接使用Compose提供的响应式状态LocalConfiguration,屏幕旋转触发配置变化时会自动触发重组更新数值:
@Composable fun getOrientation() { val currentOrientation = LocalConfiguration.current.orientation // 取值说明: // Configuration.ORIENTATION_PORTRAIT = 竖屏 // Configuration.ORIENTATION_LANDSCAPE = 横屏 Log.d("Orientation", "当前朝向:$currentOrientation") }
方案2:需要获取精确旋转角度(0°/90°/180°/270°)
通过监听配置变化,每次配置更新时重新读取屏幕旋转参数,兼容不同Android版本:
@Composable fun getScreenRotation(): Int { val configuration = LocalConfiguration.current val context = LocalContext.current return remember(configuration) { val display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { context.display } else { @Suppress("DEPRECATION") (context as Activity).windowManager.defaultDisplay } // 取值说明: // Surface.ROTATION_0 = 0°(默认竖屏) // Surface.ROTATION_90 = 90°(横屏) // Surface.ROTATION_180 = 180°(反向竖屏) // Surface.ROTATION_270 = 270°(反向横屏) display?.rotation ?: Surface.ROTATION_0 } }
注意事项
- 如果你的Activity在
AndroidManifest.xml中配置了android:configChanges="orientation|screenSize",需要确保你使用的Compose版本在1.1.0及以上,低版本Compose可能不会在配置变更时自动更新LocalConfiguration的值。 - 不要使用
LocalActivity.current.requestedOrientation读取当前朝向,该值仅用来设置/读取应用的锁定朝向,和设备实际物理朝向无关。
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

