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
相关产品推荐
相关产品推荐

