AdMob 自适应横幅未显示在 Jetpack Compose 中

AdMob adaptive banner is not showing in Jetpack Compose

我在可组合项上有一个 AdMob 常规横幅和一个自适应横幅。常规横幅显示正常,但自适应横幅不是。谁能帮忙解决这个问题?

AdMob Reference

@Composable
fun AdNetworkApp() {
    val deviceCurrentWidth = LocalConfiguration.current.screenWidthDp.toInt()

    Column(
        modifier = Modifier
            .padding(16.dp)
            .fillMaxWidth(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text("Adaptive Banner")

        // shows an Adaptive banner test ad
        AndroidView(
            factory = { context ->
                AdView(context).apply {
                    adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(
                        context,
                        deviceCurrentWidth
                    )
                    adUnitId = context.getString(R.string.ad_id_adaptive_banner)
                    loadAd(AdRequest.Builder().build())
                }
            }
        )

        Text("Regular Banner")

        // shows a banner test ad
        AndroidView(
            factory = { context ->
                AdView(context).apply {
                    adSize = AdSize.BANNER
                    adUnitId = context.getString(R.string.ad_id_banner)
                    loadAd(AdRequest.Builder().build())
                }
            }
        )
        ...

谢谢!

当您的横幅未显示时,您需要检查的第一件事是 adUnitId

如果传给adSize的宽度太大,也可能无法显示。但在你的情况下,你的 padding 应用于 Column 阻止它显示全宽。

我建议你不要使用像 40 这样的未知常量。当您确定当前视图是顶部视图时,您可以计算列内的宽度,如 screenWidthDp - 2 * padding

最“准确”的是用onSizeChanged获得列宽。

我制作了一个样本来测试 AdView 不同的宽度,none 似乎运行良好。但我建议你去看看真正的 adUnitId 而不是测试的,也许情况会更好。

val deviceCurrentWidth = LocalConfiguration.current.screenWidthDp
val padding = 16
var i by remember { mutableStateOf(0) }
var containerWidth by remember { mutableStateOf<Int?>(null) }
Column(
    horizontalAlignment = Alignment.CenterHorizontally,

    modifier = Modifier
        .padding(padding.dp)
        .fillMaxWidth()
        .onSizeChanged {
            containerWidth = it.width
        }
) {
    val items =
        listOf(
            "deviceCurrentWidth - 40" to deviceCurrentWidth - 40,
            "deviceCurrentWidth - padding * 2" to deviceCurrentWidth - padding * 2,
            "AdSize.FULL_WIDTH" to AdSize.FULL_WIDTH,
            "onSizeChanged" to with(LocalDensity.current) {
                containerWidth?.let { containerWidth ->
                    (containerWidth / density).roundToInt()
                }
            }
        )
    items.forEach {
        val (title, width) = it
        if (width == null) {
            return@forEach
        }

        Text(title)
        AndroidView(
            factory = { context ->
                AdView(context).apply {
                    adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(
                        context,
                        width
                    )
                    adUnitId = "ca-app-pub-3940256099942544/6300978111"
                    loadAd(AdRequest.Builder().build())
                }
            },
            update = { adView ->
                adView.loadAd(AdRequest.Builder().build())
                i // needed to update view on i change
            },
        )
    }
    LaunchedEffect(Unit) {
        while (true) {
            delay(1000)
            i++
        }
    }
}

结果:

p.s。还有一个小技巧:使用修饰符作为最后一个参数:在这种情况下你不需要使用逗号,所以添加和删除行变得容易得多

Column(
    horizontalAlignment = Alignment.CenterHorizontally,
    modifier = Modifier
        .fillMaxWidth()
)