【发布时间】:2022-07-11 23:46:52
【问题描述】:
我一直在寻找有关如何在 compose 上显示原生广告的示例应用程序,但我找不到任何示例应用程序。有什么解决办法吗?
【问题讨论】:
标签: admob android-jetpack-compose native-ads
我一直在寻找有关如何在 compose 上显示原生广告的示例应用程序,但我找不到任何示例应用程序。有什么解决办法吗?
【问题讨论】:
标签: admob android-jetpack-compose native-ads
您应该使用 AndroidView 来包装 AdMob AdView
来自docs:
要包含视图元素或层次结构,请使用
AndroidView组合。AndroidView传递了一个返回视图的 lambda。AndroidView还提供了在视图膨胀时调用的更新回调。每当回调中读取的State发生变化时,AndroidView就会重新组合。
AndroidView(
factory = { context: Context ->
AdView(context).apply {
// config AdView
}
},
update = { adview ->
}
)
【讨论】:
使用AndroidViewBinding 包裹NativeAdView。
// build.gradle.kts
dependencies {
implementation("androidx.compose.ui:ui-viewbinding:1.2.0-beta03")
}
创建包含 NativeAdView 的 ViewBinding。
@Composable
fun NativeMediumAd() {
AndroidViewBinding(factory = LayoutNativeAdBinding::inflate) {
// Initialize NativeAdView
val adView = root.also { adView ->
adView.advertiserView = tvAdvertiser
adView.bodyView = tvBody
adView.callToActionView = btnCta
adView.headlineView = tvHeadline
adView.iconView = ivAppIcon
adView.priceView = tvPrice
adView.starRatingView = rtbStars
adView.storeView = tvStore
adView.mediaView = mvContent
}
// Request Ad
val adLoader = AdLoader.Builder(adView.context, "NATIVE_AD_KEY")
.forNativeAd { nativeAd ->
nativeAd.advertiser?.let { advertiser ->
tvAdvertiser.text = advertiser
}
nativeAd.body?.let { body ->
tvBody.text = body
}
nativeAd.callToAction?.let { cta ->
btnCta.text = cta
}
nativeAd.headline?.let { headline ->
tvHeadline.text = headline
}
nativeAd.icon?.let { icon ->
ivAppIcon.setImageDrawable(icon.drawable)
}
nativeAd.price?.let { price ->
tvPrice.text = price
}
nativeAd.starRating?.let { rating ->
rtbStars.rating = rating.toFloat()
}
nativeAd.store?.let { store ->
tvStore.text = store
}
adView.setNativeAd(nativeAd)
})
.withNativeAdOptions(NativeAdOptions.Builder().build())
.build()
adLoader.loadAd(AdRequest.Builder().build())
}
}
完整源代码:
【讨论】: