Адаптивный баннер Android AdMob во фрагменте на kotlin?

#android #kotlin #admob #banner

#Android #kotlin #admob #баннер

Вопрос:

Официальная документация Adaptive Banner только об активности. Если я попытаюсь применить это к фрагменту, я получу Unresolved reference: windowManager . Если я пытаюсь добавить a 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)
}
  

Ответ №1:

Я настраиваю основное действие, аналогичное официальной документации, с некоторыми небольшими изменениями:

  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()
    }

}
  

И, конечно ad_view_container , в XML-файле макета фрагмента:

 ...

    <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" />

...
  

Результат