Как уже было отмечено в предыдущей статье, рекламный баннер от Admob является элементом View, и может быть добавлен на экран приложения, удален или изменен.
Если добавить элемент статически, т.е. прописав его в файле разметки (layout), то он все время будет занимать место на экране, даже если реклама в элемент не загрузилась. Показывать пустое место пользователю не стоит, т.к. он может просто обидеться и поставить низкую оценку приложению.Реклама может просто не загрузиться из-за проблем с соединением интернет. Поэтому лучше всего показывать рекламу в тот момент, когда уже точно знаешь, что реклама есть.
Для этого существует класс AdListener, т.е. тот, кто будет слушать рекламу и вызывать свои события:
- onAdClosed()
- onAdFailedToLoad(int errorCode)
- onAdLeftApplication()
- onAdLoaded()
- onAdOpened()
Этот класс нужно создать и установить на нужный элемент рекламы:
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() будет вызываться с интервалом, заданным при создании баннера в админке Адмоба.
И поэтому важно проверять, есть ли баннер на экране или ещё нет, чтобы не добавить лишний баннер и не поломать интерфейс.