#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:
Я настраиваю основное действие, аналогичное официальной документации, с некоторыми небольшими изменениями:
- Поместите
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()
}
}
И, конечно 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" />
...