Kotlin上Fragment中的Android AdMob自适应横幅?

问题描述

仅关于活动的官方文档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类似的主要活动,但做了一些小的更改:

  1. adView变量放入伴随对象中,以便可以通过片段对其进行访问
  2. ad_view_container.addView(adView)从活动的onCreate移动到了保存onViewCreated的片段的ad_view_container
  3. 从活动中删除了对广告视图容器宽度(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" />

...

The result