Нативная реклама
Нативная реклама - это гибкий вид рекламы. Вы можете адаптировать показ к своему пользовательскому интерфейсу, подготовив шаблон.
Appodeal предоставляет 4 варианта реализации макета нативной рекламы 3 шаблона + ваша кастомная
реализация
Все они наследуются от одного и того же класса NativeAdView
.
NativeAdView
состоит из следующих компонентов:
NativeIconView
- Иконка нативной рекламы.AdAttributionView
- Индикатор рекламы. Это TextView с меткой "Ad".TitleVIew
- Заголовок нативной рекламы.DescriptionView
- Текстовый вид описания нативной рекламы.RatingBarView
- Рейтинг приложения в диапазоне [0-5].NativeMediaView
- Медиаконтент нативной рекламы.CallToActionView
- Кнопка для клика.AdChoiceView
- Специальная иконка объявления, предоставляемая рекламной сетью.
- Шаблоны: Для их отображения достаточно сделать следующее:
- Создайте программно или в файле xml разметки один из классов View шаблонов;
Классы шаблонов нативной рекламы:.
-
NativeAdViewNewsFeed
: -
NativeAdViewAppWall
: -
NativeAdViewContentStream
:
NativeAdView для кастомной реализации:
Для его отображения достаточно сделать следующее:
- Создайте класс
NativeAdVIew
программно или в xml файле разметки - Внутри созданного
NativeAdVIew
расположите всеView
/IconView
/MediaView
, необходимые для отображения в любом удобном для вас стиле - Привяжите программно или в файле макета все необходимые
View
/IconView
/MediaView
.
Вид нативной рекламы в кастомной реализации:
NativeAdView
.
Вы можете использовать наше демо приложение в качестве примера по интеграции.
Демо приложение
Руководство по интеграции
- For templates
- Для кастомной разметки
- Создайте программно или в файле xml разметки один из классов View шаблонов:
- XML
- Kotlin
- Java
<com.appodeal.ads.nativead.NativeAdViewNewsFeed
android:id="@+id/native_news_feed"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.appodeal.ads.nativead.NativeAdViewAppWall
android:id="@+id/native_app_wall"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.appodeal.ads.nativead.NativeAdViewContentStream
android:id="@+id/native_content_stream"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
val newsFeedView = NativeAdViewNewsFeed(context)
val appWallView = NativeAdViewAppWall(context)
val contentStreamView = NativeAdViewContentStream(context)
NativeAdViewNewsFeed newsFeedView = new NativeAdViewNewsFeed(context);
NativeAdViewAppWall appWallView = new NativeAdViewAppWall(context);
NativeAdViewContentStream contentStreamView = new NativeAdViewContentStream(context);
- Получите экземпляр представления из макета ИЛИ добавьте программно созданный шаблон ViewTemplate в иерархию View:
- XML
- Kotlin
- Java
val newsFeedView = findViewById<NativeAdViewNewsFeed>(R.id.native_news_feed);
val appWallView = findViewById<NativeAdViewAppWall>(R.id.native_app_wall);
val contentStreamView = findViewById<NativeAdViewContentStream>(R.id.native_content_stream);
NativeAdViewNewsFeed newsFeedView = findViewById(R.id.native_news_feed);
NativeAdViewAppWall appWallView = findViewById(R.id.native_app_wall);
NativeAdViewContentStream contentStreamView = findViewById(R.id.native_content_stream);
rootView.addView(newsFeedView)
rootView.addView(appWallView)
rootView.addView(contentStreamView)
rootView.addView(newsFeedView);
rootView.addView(appWallView);
rootView.addView(contentStreamView);
- Когда NativeAd будет загружен, просто зарегистрируйте его:
- Для одного экземпляра
- Для нескольких экземпляров
- Kotlin
- Java
if (Appodeal.isLoaded(Appodeal.NATIVE)) {
newsFeedView.registerView(Appodeal.getNativeAdCount(1))
}
if (Appodeal.isLoaded(Appodeal.NATIVE)) {
newsFeedView.registerView(Appodeal.getNativeAdCount(1));
}
- Kotlin
- Java
val needToShow = 3
if (Appodeal.getAvailableNativeAdsCount() >= needToShow) {
val nativeAds = Appodeal.getNativeAdCount(needToShow)
newsFeedView.registerView(nativeAds[0])
appWallView.registerView(nativeAds[1])
contentStreamView.registerView(nativeAds[2])
}
int needToShow = 3;
if (Appodeal.getAvailableNativeAdsCount() >= needToShow) {
List<NativeAd> nativeAds = Appodeal.getNativeAdCount(needToShow);
newsFeedView.registerView(nativeAds.get(0));
appWallView.registerView(nativeAds.get(1));
contentStreamView.registerView(nativeAds.get(2);
}
- Когда показ завершен и вы больше не планируете использовать NativeAdView, необходимо вызвать метод destroy:
- Kotlin
- Java
nativeAdView.destroy()
nativeAdView.destroy();
Общие требования:.
- Минимальная высота
NativeAdView
должна составлять 32dp; NativeMediaView
должен иметь минимальный размер 120dp x 120dp;- В
AdAttributionView
должен быть четко обозначен в вашем View как "Реклама", чтобы пользователи не приняли его за контент; - Разрешается уменьшать масштаб
NativeIconView
илиNativeMediaView
без изменения соотношения сторон; - Разрешается симметрично обрезать
NativeIconView
илиNativeMediaView
не более чем на 20% только в одном измерении (высота или ширина).
- Создайте свою разметку с
NativeAdView
в качестве родителя:
Вы можете построить макет с любым стилем, расположением элементов и с любым типом
ViewGroup
(ConstrainLayout
, RelativeLayout
, FrameLayout
)
<?xml version="1.0" encoding="utf-8"?>
<com.appodeal.ads.nativead.NativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nativeAdView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:adChoicePosition="end_top"
app:callToActionViewId="@id/callToActionView"
app:descriptionViewId="@id/descriptionView"
app:iconViewId="@id/iconView"
app:mediaViewId="@id/mediaView"
app:ratingViewId="@id/ratingView"
app:titleViewId="@id/titleView"
app:adAttributionViewId="@+id/ad_attribution">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.appodeal.ads.nativead.NativeIconView
android:id="@+id/iconView"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_gravity="center_vertical"
android:layout_margin="5dp" />
<TextView
android:id="@+id/ad_attribution"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:background="@color/red" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/titleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<TextView
android:id="@+id/descriptionView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="3" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="horizontal">
<RatingBar
android:id="@+id/ratingView"
style="?android:attr/ratingBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:id="@+id/callToActionView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="30dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<com.appodeal.ads.nativead.NativeMediaView
android:id="@+id/mediaView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</com.appodeal.ads.nativead.NativeAdView>
Requirements for NativeAdView
elements
Имя view | Тип | Необходимость | Описание |
---|---|---|---|
titleView | TextView | Обязателен | Заголовок нативного объявления. В заголовке всегда должно отображаться не более 25 символов. Если заголовок длиннее, можно добавить многоточие в конце. |
callToActionView | Button | Обязателен | Кнопка призыва к действию. Текст должен отображаться без усечения на видимой кнопке. |
descriptionView | TextView | Опционален | Текстовое описание нативной рекламы. Если вы решили отобразить описание, то в нем должно быть не более 100 символов. В конце можно добавить многоточие. |
ratingView | RatingBar | Опционален | Рейтинг приложения в диапазоне [0-5]. |
adAttributionView | TextView | Обязателен | Индикатор рекламы. Это TextView с меткой "Ad". Вы можете задать цвет текста и фона. Смотрите настройки adAttribution. Вы можете разместить его в любом месте внутри NativeAdView . |
adChoicesView | ViewGroup | Добавляется автоматически | Специальный рекламный значок, предоставляемый рекламной сетью. Если SDK получил AdChoice от рекламной сети, то он прикрепляет его автоматически. Вы можете указать позицию в одном из углов NativeAdView . См. setAdChoice position |
iconView | NativeIconView | Обязателен/Опционален | Медиаконтент нативного объявления. |
mediaView | NativeMediaView | Обязателен/Опционален | Иконка нативного объявления. |
NativeAdView
должен обязательно содержать NativeIconView
или NativeMediaView
.
titleView
, callToActionView
и adAttributionView
должен быть добавлен в любом случае.
- Установите идентификаторы всех дочерних представлений
NativeAdView
.
Это можно сделать либо в xml-файле markdown (рекомендуемый способ), либо программно
- XML
- Kotlin
- Java
<com.appodeal.ads.nativead.NativeAdView
app:callToActionViewId="@id/callToActionView"
app:descriptionViewId="@id/descriptionView"
app:iconViewId="@id/iconView"
app:mediaViewId="@id/mediaView"
app:ratingViewId="@id/ratingView"
app:titleViewId="@id/titleView">
app:adAttributionViewId="@id/adAttribution">
val nativeAdView: NativeAdView = ...
nativeAdView.titleViewId = R.id.titleView
nativeAdView.callToActionViewId = R.id.callToActionView
nativeAdView.descriptionViewId = R.id.descriptionView
nativeAdView.ratingViewId = R.id.ratingView
nativeAdView.iconViewId = R.id.iconView
nativeAdView.mediaViewId = R.id.mediaView
nativeAdView.adAttributionViewId = R.id.adAttribution
// OR
nativeAdView.titleView = findViewById(R.id.titleView)
nativeAdView.callToActionView = findViewById(R.id.callToActionView)
nativeAdView.descriptionView = findViewById(R.id.descriptionView)
nativeAdView.ratingView = findViewById(R.id.ratingView)
nativeAdView.iconView = findViewById(R.id.iconView)
nativeAdView.mediaView = findViewById(R.id.mediaView)
nativeAdView.adAttributionView = findViewById(R.id.adAttribution)
NativeAdView nativeAdView: NativeAdView = ...
nativeAdView.setTitleViewId(R.id.titleView);
nativeAdView.setCallToActionViewId(R.id.callToActionView);
nativeAdView.setDescriptionViewId(R.id.descriptionView);
nativeAdView.setRatingViewId(R.id.ratingView);
nativeAdView.setIconViewId(R.id.iconView);
nativeAdView.setMediaViewId(R.id.mediaView);
nativeAdView.setAdAttributionViewId(R.id.adAttribution);
// OR
nativeAdView.setTitleView(findViewById(R.id.titleView));
nativeAdView.setCallToActionView(findViewById(R.id.callToActionView));
nativeAdView.setDescriptionView(findViewById(R.id.descriptionView));
nativeAdView.setRatingView(findViewById(R.id.ratingView));
nativeAdView.setIconView(findViewById(R.id.iconView));
nativeAdView.setMediaView(findViewById(R.id.mediaView));
nativeAdView.setAdAttributionView(findViewById(R.id.adAttribution));
3.Когда NativeAd
загружен, просто зарегистрируйте его для показа:
- Для одного экземпляра
- Для нескольких экземпляров
- Kotlin
- Java
if (Appodeal.isLoaded(Appodeal.NATIVE)) {
newsFeedView.registerView(Appodeal.getNativeAdCount(1))
}
if (Appodeal.isLoaded(Appodeal.NATIVE)) {
newsFeedView.registerView(Appodeal.getNativeAdCount(1));
}
- Kotlin
- Java
val needToShow = 3
if (Appodeal.getAvailableNativeAdsCount() >= needToShow) {
val nativeAds = Appodeal.getNativeAdCount(needToShow)
nativeAdView1.registerView(nativeAds[0])
nativeAdView2.registerView(nativeAds[1])
nativeAdView3.registerView(nativeAds[2])
}
int needToShow = 3;
if (Appodeal.getAvailableNativeAdsCount() >= needToShow) {
List<NativeAd> nativeAds = Appodeal.getNativeAdCount(needToShow);
nativeAdView1.registerView(nativeAds.get(0));
nativeAdView2.registerView(nativeAds.get(1));
nativeAdView3.registerView(nativeAds.get(2));
}
- Когда показ завершен и вы больше не планируете использовать
NativeAdView
, необходимо вызвать методdestroy
:
- Kotlin
- Java
nativeAdView.destroy()
nativeAdView.destroy();
Если вы хотите показать новую NativeAd внутри используемого nativeAdView, просто вызовите
метод nativeAdView.registerView(newNativeAd)
.
Проверка, загружена ли реклама
Чтобы проверить, загружен ли хотя бы 1 экземпляр NativeAd
, используйте метод:
- Kotlin
- Java
Appodeal.isLoaded(Appodeal.NATIVE)
Appodeal.isLoaded(Appodeal.NATIVE);
Чтобы узнать, сколько экземпляров NativeAd
загружено, используйте метод:
- Kotlin
- Java
val nativeAmount = Appodeal.getAvailableNativeAdsCount()
int nativeAmount = Appodeal.getAvailableNativeAdsCount();
По умолчанию Appodeal SDK с включенной функцией AutoCahce загружает по 2 экземпляра NativeAd
.
Мы рекомендуем всегда проверять, доступно ли объявление, прежде чем пытаться его показать.
Получить загруженную рекламу
Чтобы получить загруженную нативную рекламу, воспользуйтесь следующим методом:
- Kotlin
- Java
val nativeAds: List<NativeAd> = Appodeal.getNativeAds(amount)
List<NativeAd> nativeAds = Appodeal.getNativeAds(int amount);
После получения рекламы она удаляется из нашего кэша SDK.
Отображение
Для отображения NativeAd
необходимо вызвать следующий код:
- Kotlin
- Java
NativeAdView.registerView(nativeAd: NativeAd)
NativeAdView.registerView(NativeAd nativeAd);
SDK не может показывать рекламу без подключения к сети!
NativeAdView.registerView()
возвращает значение boolean, указывающее, был ли вызов метода show
передан соответствующему SDK.
Перед вызовом метода registerView(nativeAd)
, NativeAdView
находится в состоянии visibility == GONE
.
После вызова состояние автоматически изменится на visibility == VISIBLE
.
Вам не нужно менять состояние видимости, Appodeal SDK делает это автоматически.
После вызова destroy()
состояние автоматически изменится на visibility == GONE
.
NativeAdView
и его наследники имеют встроенный атрибут tools:visibility="visible"
, поэтому представление
будет отображаться в разметке IDE во время разработки.
Плейсменты
Appodeal SDK позволяет маркировать каждый показ различными плейсментами. Чтобы использовать плейсмент, необходимо создать его в Appodeal Dashboard. Узнайте больше о плейс ментах.
Чтобы показать рекламу с плейсментом, необходимо вызвать метод show:
- Kotlin
- Java
NativeAdView.registerView(nativeAd: NativeAd, yourPlacementName: String)
NativeAdView.registerView(NativeAd nativeAd, String yourPlacementName)
Если загруженное объявление не может быть показано для конкретного размещения, то ничего показано не будет.
Если автоматическое кэширование включено, sdk начнет загружать очередную рекламу, что может повлиять на display rate. Чтобы сохранить загруженную рекламу для дальнейшего использования (например, для другого плейсмента), проверьте, может ли оно быть показано до вызова метода show:
- Kotlin
- Java
if (NativeAd.canShow(context: Context, yourPlacementName: String)){
NativeAdView.registerView(nativeAd: NativeAd, yourPlacementName: String)
}
if (NativeAd.canShow(Context context, String yourPlacementName)){
NativeAdView.registerView(NativeAd nativeAd, String yourPlacementName)
}
Для каждого плейсмента можно настроить свою логику показа.
Если у вас нет плейсментов, или вы вызываете NativeAdView.registerView
с несуществующим плейсментом,
показ будет помече как плейсмент 'по умолчанию' и будут применены его настройки.
Настройки плейсмента влияют ТОЛЬКО на показ рекламы, но не на загрузку или кэширование.
Прекращение трекинга показа
Для прекращение трекинга показа нативной рекламы с зарегистрированной в данный момент NativeAdView
используйте метод:
- Kotlin
- Java
NativeAdView.unregisterView()
NativeAdView.unregisterView();
Метод UnregisterView
не скрывает NativeAdView
. Он приостанавливает отслеживание отображения
нативной рекламы.
UnregisterView
имеет смысл использовать, например, если NativeAdView
находится за пределами
экрана во время прокрутки списка или временно перекрывается другим View
/Fragment
/Activity
.