Как программно отобразить рекламный баннер AdMob в нижней части экрана?(Kotlin)

#android #kotlin #admob

#Android #kotlin #admob

Вопрос:

Я новичок в Kotlin и Android. Я хочу программно отобразить рекламное объявление AdMob в нижней части экрана. Но я могу отображать его только в верхней части экрана. Вот мой код:

activity_main.xml:

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@ id/activityMain"
    tools:context=".MainActivity">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="false"
        android:scaleType="centerCrop"
        android:id="@ id/rootImageView"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:id="@ id/testTextView"
        />

</androidx.constraintlayout.widget.ConstraintLayout>
  

MainActivity.kt:

 import android.app.Notification
import android.content.res.Configuration
import android.graphics.Color
import android.media.AudioManager
import android.media.MediaPlayer
import android.media.ToneGenerator
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.view.View
import android.view.WindowManager
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.constraintlayout.widget.ConstraintLayout
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdSize
import com.google.android.gms.ads.AdView
import com.google.android.gms.ads.MobileAds
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity()
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(useAdMob){ initAdMob(); }
    }
    //---------------------------------------------
    fun initAdMob()
    {
        MobileAds.initialize(this);

        val adView = AdView(this);
        adView.adSize = AdSize.BANNER;
        adView.adUnitId = if(testAdMob) idAdMobBannerForTest else idAdMobBanner1;
        val adRequest = AdRequest.Builder().build();
        adView.loadAd(adRequest);

        activityMain.addView(adView);
        adView.setBackgroundColor(Color.RED);
        
        val lp = adView.layoutParams;
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        println(">>>> adView, width: ${lp.width}, height: ${lp.height}");
    }
}
  

Я много искал решение, например, попробуйте:

 addRule(RelativeLayout.ALIGN_PARENT_BOTTOM)
  

или добавить в xml:

 android:layout_alignParentBottom="true"
  

Но, похоже, они недоступны в новейшей версии Android Studio.
Пожалуйста, помогите мне. Заранее спасибо.

Комментарии:

1. Вы используете макет ограничения в вашем xml, а не относительный макет. Таким образом, добавление правила RelativeLayout не сработает.

Ответ №1:

Я бы посоветовал не делать этого программно, но вы можете использовать ConstraintSet для программного задания правил компоновки ограничений. Выглядит примерно так:

 adView.id = View.generateViewId() // Need to give view an id

ConstraintSet().apply {
    connect(adView.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM)
    applyTo(constraintLayout) // Your constraint layout here
}
  

Это эквивалентно тому, как в xml выполняется

 app:layout_constraintBottom_toBottomOf="parent"
  

Комментарии:

1. Как получить ConstraintLayout?

2. В kotlin просто введите идентификатор вашего макета — activityMain — и kotlin synthetics получит его для вас. В более старом Android вы бы сделали findViewById(R.id.activityMain)

3. Еще один вопрос: я хочу отобразить прямоугольник красного цвета до получения объявления, поэтому я установил цвет фона AdView на красный. Но красный цвет не появляется, пока реклама не будет получена. Я когда-нибудь хотел создать вид с красным фоном, а затем установить AdView в качестве дочернего, поэтому мне нужно получить высоту AdView, прежде чем он появится. Но я получаю значение (-2) из lp.height . Как решить?

4. Я печатаю nn (AdView.height), получается 0.

5. -2 является ли параметр layout постоянным для WRAP_CONTENT, проблема в том, что вы получаете высоту до того, как она была определена. Просмотры имеют псевдонимный «жизненный цикл», который выполняется инициализацией -> измерением -> макетом -> рисованием. Размер представления не определяется до тех пор, пока не произойдет измерение. Получение ширины и высоты 0 для вашего просмотра почти всегда означает, что вы пытаетесь получить размеры до того, как произошло измерение.

Ответ №2:

Поскольку вы используете макет с ограничениями, попробуйте этот приведенный ниже код…

 <com.google.android.gms.ads.AdView
   xmlns:ads="http://schemas.android.com/apk/res-auto"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:id="@ id/bannerAd"
   ads:adUnitId="ca-app-pub-3940256099942544/6300978111"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintEnd_toEndOf="parent"/>
  

и в файле kotlin

 MobileAds.initialize(this) {}
    var mAdView = findViewById(R.id.bannerAd)
    val adRequest = AdRequest.Builder().build()
    mAdView.loadAd(adRequest)
  

Комментарии:

1. Плохая вещь в этом заключается в том, что вы всегда создаете и добавляете рекламу на экран, даже когда она не нужна.