Развернутый пример работы с Admob

Как уже было отмечено в предыдущей статье, рекламный баннер от Admob является элементом View, и может быть добавлен на экран приложения, удален или изменен.

Если добавить элемент статически, т.е. прописав его в файле разметки (layout), то он все время будет занимать место на экране, даже если реклама в элемент не загрузилась. Показывать пустое место пользователю не стоит, т.к. он может просто обидеться и поставить низкую оценку приложению.Реклама может просто не загрузиться из-за проблем с соединением интернет. Поэтому лучше всего показывать рекламу в тот момент, когда уже точно знаешь, что реклама есть.

Для этого существует класс AdListener, т.е. тот, кто будет слушать рекламу и вызывать свои события:

Этот класс нужно создать и установить на нужный элемент рекламы:

 adView.setAdListener(new AdListener() {...});

А в фигурных скобках переопределить уже названные события.

Мы будем перехватывать два события onAdLoaded() (реклама загрузилась) и onAdFailedToload(int errorCode)  (произошла ошибка загрузки, в скобках код ошибки).

Константы ошибок можно посмотреть здесь.

Если реклама загрузилась, то перестроим интерфейс и добавим баннер, если произошла ошибка, то покажем ошибку в логах.

Новый элемент на экране, может повлиять на другие, поэтому нужно изменить и их параметры разметки (LayoutParams).

Вот код загрузки рекламного баннера и добавления его в разметку:

if (!mIsAdDelete) {// загружаем рекламу
     adView = new AdView(this);
     adView.setAdSize(AdSize.BANNER);
     adView.setAdUnitId(getResources().getString(R.string.pubID));
     adView.setAdListener(new AdListener() {

        @Override
        public void onAdFailedToLoad(int errorCode) {
               Log.d("main", "реклама не загружена errorCode=" + errorCode);
           super.onAdFailedToLoad(errorCode);
        }

        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            Log.d("main", "onAdLoaded");
            if (adView.getId() == View.NO_ID) {
            Log.d("main", "реклама загружена");
            RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(
                          RelativeLayout.LayoutParams.MATCH_PARENT,
                          RelativeLayout.LayoutParams.WRAP_CONTENT);
            findId();
            adView.setId(id);
            lay.addRule(RelativeLayout.ALIGN_PARENT_TOP);
            RelativeLayout layout = (RelativeLayout) findViewById(R.id.MainView);
            layout.addView(adView, lay);

            TabHost tabs = (TabHost) findViewById(android.R.id.tabhost);
            RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
                        RelativeLayout.LayoutParams.MATCH_PARENT,
                        RelativeLayout.LayoutParams.MATCH_PARENT);
                        p.addRule(RelativeLayout.BELOW, id);
                        tabs.setLayoutParams(p);
                    }

                }
            });
            AdRequest adRequest = new AdRequest.Builder()
             .addTestDevice("836526109D0A2DCC41D7D5F99D708015")
                    .build();
            adView.loadAd(adRequest);
}

Перед этим вызываем процедуру loaddata()

void loadData() {
	SharedPreferences sp = getPreferences(MODE_PRIVATE);
	mIsAdDelete = sp.getBoolean("mIsAdDelete", false);
	int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
	if (status != ConnectionResult.SUCCESS)
		mIsAdDelete = true;

	}

Она скажет, нужно ли нам загружать рекламу, она может быть отключена в настройках SharedPreferences, а может быть и не доступна из-за версии GooglePlayServices.
Когда мы проверили все, что можно, начинаем загружать рекламу:

adView.loadAd(adRequest);

И вот произошло событие onAdLoaded.
Мы динамически добавляем элемент adView к разметке:

layout.addView(adView, lay);

И вычисляем его id внутри её adView.setId(id);
Метод для получения нового числа findId():

public int findId() {
while (findViewById(++id) != null)
		;
	return id;
}

Изменяем уже имеющийся элемент TabHost и ставим его на экране за баннером

p.addRule(RelativeLayout.BELOW, id);

У каждого элемента View должен быть свой id (ну или хотя бы велосипед).
В статической разметке он прописывается таким образом: android:id=»@+id/textView3″, если точнее, то это команда генерировать новый id для этого элемента, который потом будет помещен в класс R.id.
Когда мы создаем элемент динамически, то можно задать любой свой id, который по сути является простым положительным числом (int).
Главное, чтобы числа не повторялись. В 17 апи появилась функция View.generateViewId(), но апи довольно новая и старые устройства его не поймут.
У каждого элемента View можно спросить его id getId() и он нам русским языком скажет свой id или скажет, что у него его нет: NO_ID
Таким образом удобно проверять, есть элемент уже на экране или нет.

if (adView.getId() == View.NO_ID)

Событие onAdLoaded() будет вызываться с интервалом, заданным при создании баннера в админке Адмоба.
И поэтому важно проверять, есть ли баннер на экране или ещё нет, чтобы не добавить лишний баннер и не поломать интерфейс.

Нашли ошибку в тексте?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *