You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:15:01