问题描述
仅关于活动的官方文档Adaptive Banner
。如果我尝试将其应用于片段,则会得到Unresolved reference: windowManager
。如果要向片段中添加WindowManager interface
,则需要重写5种我不知道该怎么做的方法。 addView(),updateViewLayout(),removeView(),getDefaultdisplay(),removeViewImmidiate()
。有没有人准备好如何向片段添加自适应标语的示例?
private val adSize: AdSize
get() {
val display = windowManager.defaultdisplay
val outMetrics = displayMetrics()
display.getMetrics(outMetrics)
val density = outMetrics.density
var adWidthPixels = ad_view_container.width.toFloat()
if (adWidthPixels == 0f) {
adWidthPixels = outMetrics.widthPixels.toFloat()
}
val adWidth = (adWidthPixels / density).toInt()
return AdSize.getCurrentOrientationBannerAdSizeWithWidth(this,adWidth)
}
解决方法
我设置了与official documentation类似的主要活动,但做了一些小的更改:
- 将
adView
变量放入伴随对象中,以便可以通过片段对其进行访问 - 将
ad_view_container.addView(adView)
从活动的onCreate
移动到了保存onViewCreated
的片段的ad_view_container
- 从活动中删除了对广告视图容器宽度(
ad_view_container.width.toFloat()
的检查,因为ad_view_container
现在位于片段中。因此,必须将全屏宽度用于广告。也许有某种方法可以从片段中获取ad_view_container
的宽度,但是对我来说这不是必需的,因为我想要一个全角广告。
class MyActivity : AppCompatActivity() {
companion object {
lateinit var adView: AdView
}
// Set the ad size to the full screen width.
private val adSize: AdSize
get() {
val display = windowManager.defaultDisplay
val outMetrics = DisplayMetrics()
display.getMetrics(outMetrics)
val density = outMetrics.density
val adWidthPixels = outMetrics.widthPixels.toFloat()
val adWidth = (adWidthPixels / density).toInt()
return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this,adWidth)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
// Initialize the Mobile Ads SDK.
MobileAds.initialize(this) { }
adView = AdView(this)
loadBanner()
}
private fun loadBanner() {
adView.adUnitId = "ca-app-pub-3940256099942544/6300978111" //TODO - change
adView.adSize = adSize
// Create an ad request.
val adRequest = AdRequest.Builder().build()
// Start loading the ad in the background.
adView.loadAd(adRequest)
}
}
片段:
class HomeFragment : Fragment() {
...
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
// Add the adaptive banner to its container
ad_view_container.addView(adView)
}
override fun onDestroyView() {
super.onDestroyView()
// Remove the adaptive banner from its container
adViewContainer.removeAllViews()
}
}
当然还有片段布局xml文件中的ad_view_container
:
...
<FrameLayout
android:id="@+id/ad_view_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
...