在 LazyColumn 中离开屏幕时,AdManagerAdView 不呈现广告图像
AdManagerAdView not rendering ad image when off screen in LazyColumn
我将 AdManagerAdView 包装在 AndroidView 中,以便我可以在 Jetpack Compose 中使用它。当我在 LazyColumn 中使用图像时图像无法加载并且 AdManagerAdView 尝试在可组合项出现在屏幕上之前加载图像。
如果我快速滚动到该元素,那么 LazyColumn 会合成它并且它会在图像从广告服务器返回之前显示在屏幕上,它会按预期工作。
LazyColumn {
items(5) {
SomeOtherComposable(it)
}
item {
AndroidView(
modifier = Modifier
.width(300.dp)
.height(250.dp)
.background(Color.Green),
factory = { context ->
val adView = AdManagerAdView(context)
adView.adSize = AdSize.MEDIUM_RECTANGLE
adView.adUnitId = adUnitId
adView.loadAd(Builder().build())
adView
}
)
}
items(5) {
SomeOtherComposable(it)
}
}
出于演示目的...
@Composable
fun SomeOtherComposable(i: Int) {
Text(
text = "SomeOtherComposable $i",
modifier = Modifier
.fillMaxWidth()
.height(320.dp)
.background(Color.White)
)
}
如果包装的 AdManagerAdView 用于 非惰性 列或任何其他 Compose 布局,这也可以正常工作。
这在 LazyColumn 中感觉像是一个奇怪的计时事件,它恰好在可组合项未出现在屏幕上时出现,因为在常规列中使用它在相同情况下工作正常。
有没有人经历过这样的事情?
已解决
请参阅下面我的回答
好的,问题实际上是 factory{}
和 update{}
在 AndroidView 通过布局通道之前被调用。在我的重现步骤中,广告图像在测量宽度和高度之前返回并添加到内部视图。
解决方案是使用 doOnLayout{}
将加载调用延迟到布局通过之后,如下所示:
AndroidView(
modifier = Modifier
.width(300.dp)
.height(250.dp)
.background(Color.Green),
factory = { context ->
val adView = AdManagerAdView(context)
adView.adSize = AdSize.MEDIUM_RECTANGLE
adView
},
update = { adView ->
adView.adUnitId = adUnitId
adView.doOnLayout {
adView.loadAd(Builder().build())
}
}
)
我将 AdManagerAdView 包装在 AndroidView 中,以便我可以在 Jetpack Compose 中使用它。当我在 LazyColumn 中使用图像时图像无法加载并且 AdManagerAdView 尝试在可组合项出现在屏幕上之前加载图像。
如果我快速滚动到该元素,那么 LazyColumn 会合成它并且它会在图像从广告服务器返回之前显示在屏幕上,它会按预期工作。
LazyColumn {
items(5) {
SomeOtherComposable(it)
}
item {
AndroidView(
modifier = Modifier
.width(300.dp)
.height(250.dp)
.background(Color.Green),
factory = { context ->
val adView = AdManagerAdView(context)
adView.adSize = AdSize.MEDIUM_RECTANGLE
adView.adUnitId = adUnitId
adView.loadAd(Builder().build())
adView
}
)
}
items(5) {
SomeOtherComposable(it)
}
}
出于演示目的...
@Composable
fun SomeOtherComposable(i: Int) {
Text(
text = "SomeOtherComposable $i",
modifier = Modifier
.fillMaxWidth()
.height(320.dp)
.background(Color.White)
)
}
如果包装的 AdManagerAdView 用于 非惰性 列或任何其他 Compose 布局,这也可以正常工作。
这在 LazyColumn 中感觉像是一个奇怪的计时事件,它恰好在可组合项未出现在屏幕上时出现,因为在常规列中使用它在相同情况下工作正常。
有没有人经历过这样的事情?
已解决 请参阅下面我的回答
好的,问题实际上是 factory{}
和 update{}
在 AndroidView 通过布局通道之前被调用。在我的重现步骤中,广告图像在测量宽度和高度之前返回并添加到内部视图。
解决方案是使用 doOnLayout{}
将加载调用延迟到布局通过之后,如下所示:
AndroidView(
modifier = Modifier
.width(300.dp)
.height(250.dp)
.background(Color.Green),
factory = { context ->
val adView = AdManagerAdView(context)
adView.adSize = AdSize.MEDIUM_RECTANGLE
adView
},
update = { adView ->
adView.adUnitId = adUnitId
adView.doOnLayout {
adView.loadAd(Builder().build())
}
}
)