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

Jetpack Compose中如何获取整数设备宽度以展示AdMob自适应横幅

问题原因

你现有的设备宽度计算逻辑完全错误:

  • LocalConfiguration.current.screenWidthDp 本身就已经是dp单位的当前屏幕宽度数值
  • 你用dp值除以densityDpi得到的是一个远小于正常范围的无效值,AdMob无法识别该无效宽度,因此横幅加载失败
  • AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize 方法的第二个参数要求传入的就是dp单位的可用宽度,不需要额外做单位转换

修复方案

直接使用screenWidthDp作为宽度参数即可,你可以根据需求添加边距扣除、宽度范围校验的逻辑,避免出现无效值:

// 直接获取dp单位的屏幕宽度
val screenWidthDp = LocalConfiguration.current.screenWidthDp
// 可选:如果横幅需要预留左右边距,扣除对应dp值,示例为左右各16dp,共扣除32dp
val availableWidthDp = screenWidthDp - 32
// 可选:宽度范围校验,AdMob自适应横幅推荐宽度范围为320dp~900dp,避免超出规范
val adWidthDp = availableWidthDp.coerceIn(320, 900)

随后将处理后的宽度传入AdView配置即可:

AndroidView(
    factory = { context ->
        AdView(context).apply {
            adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(
                context,
                adWidthDp
            )
            adUnitId = context.getString(R.string.ad_id_banner)
            loadAd(AdRequest.Builder().build())
        }
    }
)

补充注意点

  • 如果你的应用支持屏幕旋转,需要在配置变化时重新初始化AdView,保证宽度匹配当前屏幕方向
  • 如果需要更精准的窗口宽度(排除系统导航栏、状态栏等装饰区域的影响),可以使用WindowManager获取当前窗口的实际可用宽度再转换为dp单位使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:36:03