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

Android Compose中WindowSizeClass计算结果异常问题咨询

问题原因与解决方案

核心原因:全屏尺寸 vs 可用区域尺寸的差异

你遇到的问题根源在于calculateWindowSizeClass使用的是包含系统栏(状态栏、导航栏)的全屏窗口尺寸,而你通过LocalConfiguration获取的screenHeightDp是排除系统栏后的可用显示区域尺寸。

根据WindowSizeClass的官方判定规则:

  • 高度SizeClass为Medium的范围是 480dp ≤ 高度 < 900dp
  • 高度SizeClass为Expanded的范围是 高度 ≥ 900dp

你的Pixel C横屏时,可用区域高度是820dp(符合Medium判定),但全屏窗口的高度(包含系统栏)实际超过了900dp,因此被判定为Expanded。

验证与解决方法

1. 验证全屏尺寸数值

在calculateWindowSizeClass中添加日志,确认全屏高度的DP值:

val size = with(density) { metrics.bounds.toComposeRect().size.toDpSize() }
Log.i(LOG_TAG, "Full screen height: ${size.height}")

2. 基于可用区域计算SizeClass

如果需要以可用显示区域为基准计算SizeClass,直接使用LocalConfiguration的参数构建DpSize:

@ExperimentalMaterial3WindowSizeClassApi
@Composable
fun calculateWindowSizeClassForUsableArea(): WindowSizeClass {
    val configuration = LocalConfiguration.current
    val usableSize = DpSize(
        width = configuration.screenWidthDp.dp,
        height = configuration.screenHeightDp.dp
    )
    return WindowSizeClass.calculateFromSize(usableSize)
}

3. 精准扣除系统栏Insets

如果需要针对特定系统栏(如仅扣除导航栏)调整尺寸,可通过WindowInsets获取Insets值并从全屏尺寸中扣除:

@ExperimentalMaterial3WindowSizeClassApi
@Composable
fun calculateWindowSizeClassWithInsets(activity: Activity): WindowSizeClass {
    LocalConfiguration.current
    val density = LocalDensity.current
    val windowMetrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(activity)
    val insets = windowMetrics.windowInsets
    // 扣除状态栏和导航栏的高度
    val usableHeight = windowMetrics.bounds.height() - insets.systemWindowInsetTop - insets.systemWindowInsetBottom
    val usableWidth = windowMetrics.bounds.width() - insets.systemWindowInsetLeft - insets.systemWindowInsetRight
    val usableSize = with(density) {
        DpSize(
            width = usableWidth.toDp(),
            height = usableHeight.toDp()
        )
    }
    return WindowSizeClass.calculateFromSize(usableSize)
}

关于LocalConfiguration.current的说明

你代码中的LocalConfiguration.current仅用于监听配置变化(如横竖屏切换),触发重组重新计算SizeClass,本身不是导致异常的原因。

内容的提问来源于stack exchange,提问作者vareste

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:45:33