跳到主要内容

Native/Icon

外观和风格与应用自然融为一体的定制广告。

简介

渲染方式

类型说明
自渲染广告平台返回广告素材由开发者来拼接成的类型。类型选择需要和Hisavana平台保持一致,否则请求失败。
模板渲染广告平台返回渲染好的view,页面内直接添加到一个容器就可以展示出来。

自渲染

模板渲染:支持上图下文、下图上文、左图右文、右图左文,竖图文、全屏图,可以微调展现样式。

上图下文下图上文左图右文
建议不限制布局高度
右图左文竖图文全屏图
建议不限制布局高度建议不限制布局高度,建议限制布局宽度建议布局宽高是match_parent

广告类型

类型说明
Native内容区域包含广告标示、徽标、主图、标题、描述、按钮等自定义样式。默认请求广告数量为1条(建议采用默认),当onAdLoaded回调成功后将数组内的第1条广告进行展示。
Icon通常情况下内容区域只包含Icon图。默认请求广告数量为1条,最大请求数量为5条,当onAdLoaded回调成功后将数组内的广告进行展示。

加载广告

Native:请设置相应参数和监听回调。

// 初始化Ntaive广告对象,其中"native_id"是Native广告位ID
TNative tNativeAd = new TNative("native_id");
// 设置广告监听器
tNativeAd.setListener(new TAdListener());
// 加载广告
tNativeAd.loadAd();

Icon:请设置相应参数和监听回调。

// 初始化Ntaive广告对象,其中"icon_id"是Icon广告位ID
TNative tNativeAd = new TNative("icon_id");
// 设置广告监听器
tNativeAd.setListener(new TAdListener());
// 设置是否是请求ICON类型的广告位
tNativeAd.setLoadIcon(true);
// 设置请求广告数量
tNativeAd.setAdCount(4);
// 加载广告
tNativeAd.loadAd();

广告监听器

// 广告监听器,监听广告的请求超时、加载完成(填充)、展示、点击、异常、关闭动作的回调
private static class TAdListener extends AdListener {

// 异常回调(适用的广告位:所有广告位)
@Override
public void onError(TaErrorCode adError) {
Log.d(TAG,"Ad failed callback");
}

// 加载完成回调(适用的广告位:Native/Icon)
@Override
public void onAdLoaded(List<TaNativeInfo> adInfos) {
Log.d(TAG,"Ad loaded callback");
}

// 点击回调(适用的广告位:Native/Icon)
@Override
public void onNativeAdClick(TaNativeInfo taNativeInfo) {
Log.d(TAG,"Ad click callback");
}

// 展示回调(适用的广告位:Native/Icon)
@Override
public void onNativeAdShow(TaNativeInfo taNativeInfo) {
Log.d(TAG,"Ad show callback");
}

// 请求超时回调(适用的广告位:所有广告位)
@Override
public void onTimeOut() {
Log.d(TAG,"Ad request timeout callback");
}

// 关闭回调(适用的广告位:Native/Icon)
@Override
public void onAdClosed(TaNativeInfo taNativeInfo) {
Log.d(TAG,"Ad close callback");
}

}

展示广告

请把TNativeView对象展示出来。

重点标记

Native: 对于跳到PalmStore落地页的广告,必须添加storeMarkView(应用商店标识),否则会影响下载广告的跳转链路。

Icon: 通常情况下无需要设置主图,只需要设置icon即可。

具体详情请参考TaNativeInfo

提醒:如果你想展示符合俄罗斯合规的自渲染 Native 广告,参见 展示俄罗斯合规广告

步骤一:创建TNativeView对象

// 请在父布局的xml中新增TNativeView
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.cloud.hisavana.sdk.api.view.TNativeView
android:id="@+id/native_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
// 绑定xml布局中的view
TNativeView nativeView = findViewById(R.id.native_view);

或者

// 手动创建TNativeView对象,并添加到父布局
TNativeView nativeView = new TNativeView(this);

步骤二:新增子布局文件

Native:新增Native广告元素的子布局文件native_install.xml,其中广告元素中的icon用ImageView渲染,大图用MediaView渲染。详细请参考高级设置

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ad_unit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/item_background">
<com.cloud.hisavana.sdk.api.view.MediaView
android:id="@+id/coverview"
android:layout_width="match_parent"
android:layout_height="200dp"
tools:background="#22000000"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>

<com.cloud.hisavana.sdk.api.view.AdChoicesView
android:id="@+id/ad_choice"
android:layout_width="@dimen/dp_12"
android:layout_height="@dimen/dp_12"
app:layout_constraintLeft_toRightOf="@+id/native_ad"
app:layout_constraintTop_toTopOf="parent" />

<ImageView
android:id="@+id/native_ad"
android:layout_width="@dimen/dp_12"
android:layout_height="@dimen/dp_12"
android:src="@drawable/hisavana_ad_big"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
</ImageView>

<ImageView
android:id="@+id/native_ad_icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
tools:background="#22000000"
app:layout_constraintTop_toBottomOf="@+id/coverview"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="10dp"/>
<TextView
android:id="@+id/native_ad_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:ellipsize="end"
android:lines="1"
android:textColor="@android:color/black"
android:textSize="18sp"
tools:text="Title"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
app:layout_constraintTop_toBottomOf="@+id/coverview"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>

<TextView
android:id="@+id/native_ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@android:color/black"
android:textSize="15sp"
tools:text="des\ndes"
android:layout_marginLeft="10dp"
app:layout_constraintTop_toBottomOf="@+id/native_ad_title"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>

<TextView
android:id="@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rating"
app:layout_constraintTop_toBottomOf="@+id/native_ad_body"
android:layout_marginLeft="10dp"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>

<Button
android:id="@+id/call_to_action"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="DOWNLOAD NOW!"
android:textAllCaps="false"
android:layout_marginTop="10dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/rating" />

<!-- 对于跳到PalmStore落地页的广告,必须添加storeMarkView(应用商店标识),否则会影响下载广告的跳转链路。 -->
<com.cloud.hisavana.sdk.api.view.StoreMarkView
android:id="@+id/ps_mark_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/call_to_action"
app:layout_constraintEnd_toEndOf="parent" />

<com.cloud.hisavana.sdk.api.view.AdCloseView
android:id="@+id/hisavana_ad_close"
android:layout_width="20dp"
android:layout_height="20dp"
tools:ignore="MissingConstraints"
android:layout_margin="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Icon:新增Icon广告元素的子布局文件item_icon.xml

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ad_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/item_background">

<ImageView
android:id="@+id/native_ad_icon"
android:layout_width="80dp"
android:layout_height="80dp"
android:scaleType="fitCenter"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

步骤三:数据与视图绑定

Native

绑定:如下所示

// 请参考广告监听器"onAdLoaded(List<TaNativeInfo> adInfos)"中的处理方式
@Override
public void onAdLoaded(List<TaNativeInfo> adInfos) {
Log.d(TAG,"Ad request successful");
TaNativeInfo ad;
if (adInfos != null && !adInfos.isEmpty()) {
for (int i = 0; i < adInfos.size(); i++) {
ad = adInfos.get(i);
if (ad == null) {
continue;
}
if (tNativeAd.isReady(ad)) {
inflateView(ad, tNativeAd, nativeView);
break;
} else {
Log.d(TAG, "广告已过期");
}
}
}
}

自渲染

// 自渲染广告,在此处绑定填充数据
private void inflateView(TaNativeInfo adNativeInfo, TNative nativeAd, TNativeView nativeView) {
ConstraintLayout adView = (ConstraintLayout) LayoutInflater.from(nativeView.getContext()).inflate(R.layout.native_install, null);
// 绑定icon控件
ImageView icon = adView.findViewById(R.id.native_ad_icon);
// 绑定广告主图控件
MediaView mediaView = adView.findViewById(R.id.coverview);
// 绑定广告⻆标控件
AdChoicesView adChoicesView = adView.findViewById(R.id.ad_choice);
// 绑定广告关闭控件
AdCloseView adCloseView = adView.findViewById(R.id.hisavana_ad_close);
// 必选项,绑定应用商店标识控件
StoreMarkView storeMarkView = adView.findViewById(R.id.store_mark_view);

// 绑定标题控件
TextView title = adView.findViewById(R.id.native_ad_title);
// 绑定描述控件
TextView des = adView.findViewById(R.id.native_ad_body);
// 绑定响应动作控件
Button calltoaction = adView.findViewById(R.id.call_to_action);

TextView rating = adView.findViewById(R.id.rating);

nativeView.destroy();

// 设置icon控件
nativeView.setIconView(icon);
// 设置广告主图控件
nativeView.setMediaView(mediaView, ImageView.ScaleType.FIT_XY);
// 设置广告⻆标控件
nativeView.setAdChoiceView(adChoicesView);
// 设置广告关闭控件
nativeView.setAdCloseView(adCloseView);
// 必选项,设置应用商店标识控件
nativeView.setPsMarkView(storeMarkView);
// 添加广告视图
nativeView.addView(adView);

title.setText(adNativeInfo.getTitle());
des.setText(adNativeInfo.getDescription());
calltoaction.setText(adNativeInfo.getCtatext());

if (!TextUtils.isEmpty(adNativeInfo.getRating())) {
rating.setText("R : " + adNativeInfo.getRating());
}
List<View> adContains = new ArrayList<>();
adContains.add(title);
adContains.add(icon);
adContains.add(mediaView);
adContains.add(calltoaction);
adContains.add(des);
adContains.add(adView);
adContains.add(adCloseView);
adContains.add(storeMarkView);
nativeView.setupViews(adNativeInfo);
tNativeAd.registerViews(nativeView, adContains, adNativeInfo);
}

模版渲染

private void inflateView(TaNativeInfo adNativeInfo, TNative nativeAd, TNativeView nativeView) {
// 模版对象
TemplateStyle templateStyle;
// Boolean类型:"isChangeStyle"
if (isChangeStyle) {
// 可自行对模块进行微调
templateStyle = new TemplateStyle.Builder()
.titleSize(20).titleColor(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).isTitleBold(0)
.descColor(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).descSize(20).isDescBold(1)
.callToAction_text_color(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).callToAction_text_isBold(1).callToAction_text_size(20)
.callToAction_background_color(CoreUtil.getContext().getResources().getColor(R.color.ad_button_bg_color))
.callToAction_corner_radius(0).callToAction_stroke_color(CoreUtil.getContext().getResources()
}.getColor(R.color.hisavana_ad_color_0051E1)).callToAction_stroke_width(5)
//.callToAction_background_shape(CoreUtil.getContext().getResources().getDrawable(R.drawable.hisavana_bg_shadow))
.background(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_787878))
.build();
} else {
// 采用默认模版
templateStyle = new TemplateStyle.Builder().build();
}
nativeView.setTemplateStyle(templateStyle);
nativeAd.registerViews(nativeView, adNativeInfo);
}

媒体配置平台设置

Icon

绑定:如下所示

// 请参考广告监听器"onAdLoaded(List<TaNativeInfo> adInfos)"中的处理方式
@Override
public void onAdLoaded(List<TaNativeInfo> adInfos) {
Log.d(TAG,"Ad request successful");
TaNativeInfo ad;
if (adInfos != null && !adInfos.isEmpty()) {
for (int i = 0; i < adInfos.size(); i++) {
ad = adInfos.get(i);
if (ad == null) {
continue;
}

// 示例只展示1个icon广告,假如需要展示多个可自行通过RecyclerView添加绑定
if (tNativeAd.isReady(ad)) {
inflateView(ad, tNativeAd, nativeView);
break;
} else {
Log.d(TAG, "广告已过期");
}
}
}
}
// 在此处绑定填充数据
private void inflateView(TaNativeInfo adNativeInfo, TNative nativeAd, TNativeView nativeView) {
ConstraintLayout adView = (ConstraintLayout) LayoutInflater.from(nativeView.getContext()).inflate(R.layout.item_icon, null);
// 绑定icon控件
ImageView icon = adView.findViewById(R.id.native_ad_icon);
// 设置icon控件
nativeView.setIconView(icon);
// 添加广告视图
nativeView.addView(adView);

List<View> adContains = new ArrayList<>();
adContains.add(icon);
adContains.add(adView);
tNativeAd.registerViews(nativeView, adContains, adNativeInfo);
}

销毁广告

请及时回收广告,否则App会发生内存泄漏。

Native

@Override
public void onAdClosed(TaNativeInfo taNativeInfo) {
// 广告关闭后,假如不再继续使用,建议您及时释放视图和广告对象,避免内存泄漏。
if(nativeView != null){
nativeView.destroy();
taNativeInfo.destroy();
}
}
// 退出广告场景后,请销毁该广告对象。
@Override
protected void onDestroy() {
super.onDestroy();

// 释放TaNativeInfo资源,"adInfos"是onAdLoaded(List<TaNativeInfo> adInfos)中的列表数据
for (TaNativeInfo taNativeInfo : adInfos) {
if(taNativeInfo != null){
taNativeInfo.destroy();
}
}
adInfos.clear();

// 容器资源释放
if (nativeView != null) {
nativeView.destroy();
}

// 广告对象释放
if (nativeAd != null) {
nativeAd.destroy();
}
}

Icon

// 退出广告场景后,请销毁该广告对象。
@Override
protected void onDestroy() {
super.onDestroy();

// 释放TaNativeInfo资源,"adInfos"是onAdLoaded(List<TaNativeInfo> adInfos)中的列表数据
for (TaNativeInfo taNativeInfo : adInfos) {
if(taNativeInfo != null){
taNativeInfo.destroy();
}
}
adInfos.clear();

// 容器资源释放
if (nativeView != null) {
nativeView.destroy();
}

// 广告对象释放
if (tNativeAd != null) {
tNativeAd.destroy();
}
}

其它API

API调用介绍
tNativeAd.setLoadIcon(boolean isLoadIcon)如果当前要请求的代码位类型是ICON,设置为true,默认false
tNativeAd.setAdCount(int adCount)当前请求广告的数量,默认1条,最多5条(当代码位类型是ICON时,一次性可以请求多条广告)
tNativeAd.isAdValid()当前广告是否在有效期内
tNativeAd.isLoaded(TaNativeInfo adNativeInfo)当前广告是否加载成功
adNativeInfo.isOfflineAd()当前广告是否离线

高级设置

所需的广告要素

字段说明
Native
Icon
native_ad广告标示,用于明确指明相应单元是广告必须可选
ad_choice广告客户的徽标必须可选
hisavana_ad_close用于关闭广告内容可选
ps_mark_view用于能够拉起应用商店的标识必须(PS广告)
coverview显示广告的主要内容区域(图片、视频)必须
native_ad_icon广告图标,采用方形宽高比 (1:1) 的小尺寸应用图标可选必须
native_ad_title主要的标题文字可选
native_ad_body次要的正文文字(例如,文章或应用说明)可选
call_to_action鼓励用户采取行动(例如“访问网站”或“安装”)的按钮或文字字段。
您可以显示应用下载图标,而非按钮或文字
可选

展示俄罗斯合规广告

针对产品在俄罗斯上架发布、并通过 Hisavana 变现(集成 Hisavana sdk)的开发者需严格遵俄罗斯广告相关法律。

Hisavana sdk 3.0.8 及以上版本支持展示符合俄罗斯广告合规的广告,需要您在自渲染 Native 广告时额外做一些集成相关的操作。

主要集成的区别在 展示广告 栏目中的 步骤二步骤三,我们需要替换 广告AD角标 视图的展示方式,并且新增 免责声明 视图。

提醒:下述 通用版 指非俄罗斯合规版本。

步骤一:创建TAdNativeView对象

同上。

步骤二:新增子布局文件

新增Native广告元素的子布局文件native_install.xml,其中广告元素中的icon用ImageView渲染,大图用MediaView渲染。详细请参考高级设置

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ad_unit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/item_background"
android:orientation="vertical">

<com.cloud.hisavana.sdk.api.view.MediaView
android:id="@+id/coverview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:background="#22000000" />

<!-- 必选项:俄罗斯合规版本免责声明 View -->
<com.cloud.hisavana.sdk.api.view.AdDisclaimerView
android:id="@+id/ad_disclaimer_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="@id/coverview"
app:layout_constraintEnd_toEndOf="@id/coverview"
app:layout_constraintBottom_toBottomOf="@id/coverview" />

<com.cloud.hisavana.sdk.api.view.AdChoicesView
android:id="@+id/ad_choice"
android:layout_width="@dimen/ad_badge_height"
android:layout_height="@dimen/ad_badge_height"
app:layout_constraintEnd_toStartOf="@+id/ad_badge_view"
app:layout_constraintTop_toTopOf="parent" />

<!-- 通用版 AD 角标,如果您是从通用版本升级上来,则需要用下面的 AdBadgeView 替换此处的 ImageView -->
<!-- <ImageView-->
<!-- android:id="@+id/native_ad"-->
<!-- android:layout_width="@dimen/dp_12"-->
<!-- android:layout_height="@dimen/dp_12"-->
<!-- android:src="@drawable/hisavana_ad_big"-->
<!-- app:layout_constraintTop_toTopOf="parent"-->
<!-- app:layout_constraintEnd_toStartOf="@+id/hisavana_ad_close">-->
<!-- </ImageView>-->

<!-- 必选项:俄罗斯合规版本 AD 角标 -->
<com.cloud.hisavana.sdk.api.view.AdBadgeView
android:id="@+id/ad_badge_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/ad_badge_height"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@+id/hisavana_ad_close">
</com.cloud.hisavana.sdk.api.view.AdBadgeView>

<ImageView
android:id="@+id/native_ad_icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
tools:background="#22000000"
app:layout_constraintTop_toBottomOf="@+id/coverview"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="10dp"/>

<TextView
android:id="@+id/native_ad_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:ellipsize="end"
android:lines="1"
android:textColor="@android:color/black"
android:textSize="18sp"
tools:text="Title"
android:layout_marginTop="10dp"
android:layout_marginStart="10dp"
app:layout_constraintTop_toBottomOf="@+id/coverview"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>

<TextView
android:id="@+id/native_ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@android:color/black"
android:textSize="15sp"
tools:text="des\ndes"
android:layout_marginStart="10dp"
app:layout_constraintTop_toBottomOf="@+id/native_ad_title"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>

<TextView
android:id="@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rating"
app:layout_constraintTop_toBottomOf="@+id/native_ad_body"
android:layout_marginStart="10dp"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>

<Button
android:id="@+id/call_to_action"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="DOWNLOAD NOW!"
android:textAllCaps="false"
android:layout_marginTop="10dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/rating" />

<com.cloud.hisavana.sdk.api.view.StoreMarkView
android:id="@+id/ps_mark_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/call_to_action"
app:layout_constraintEnd_toEndOf="parent" />

<com.cloud.hisavana.sdk.api.view.AdCloseView
android:id="@+id/hisavana_ad_close"
android:layout_width="@dimen/ad_badge_height"
android:layout_height="@dimen/ad_badge_height"
android:layout_marginEnd="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

步骤三:数据与视图绑定

// 请参考广告监听器"onAdLoaded(List<TaNativeInfo> adInfos)"中的处理方式
@Override
public void onAdLoaded(List<TaNativeInfo> adInfos) {
Log.d(TAG,"Ad request successful");
TaNativeInfo ad;
if (adInfos != null && !adInfos.isEmpty()) {
for (int i = 0; i < adInfos.size(); i++) {
ad = adInfos.get(i);
if (ad == null) {
continue;
}
if (tNativeAd.isReady(ad)) {
inflateView(ad, tNativeAd, nativeView);
break;
} else {
Log.d(TAG, "广告已过期");
}
}
}
}

自渲染

// 自渲染广告,在此处绑定填充数据
private void inflateView(TaNativeInfo adNativeInfo, TNative nativeAd, TNativeView nativeView) {
ConstraintLayout adView = (ConstraintLayout) LayoutInflater.from(nativeView.getContext()).inflate(R.layout.native_install, null);
// 绑定icon控件
ImageView icon = adView.findViewById(R.id.native_ad_icon);
// 绑定广告主图控件
MediaView mediaView = adView.findViewById(R.id.coverview);
// 绑定广告⻆标控件
AdChoicesView adChoicesView = adView.findViewById(R.id.ad_choice);
// 绑定广告关闭控件
AdCloseView adCloseView = adView.findViewById(R.id.hisavana_ad_close);
// 必选项:绑定应用商店标识控件
StoreMarkView storeMarkView = adView.findViewById(R.id.store_mark_view);

// 绑定标题控件
TextView title = adView.findViewById(R.id.native_ad_title);
// 绑定描述控件
TextView des = adView.findViewById(R.id.native_ad_body);
// 绑定响应动作控件
Button calltoaction = adView.findViewById(R.id.call_to_action);

TextView rating = adView.findViewById(R.id.rating);

// 必选项:绑定俄罗斯合规版本 AD角标
AdBadgeView adBadgeView = adView.findViewById(R.id.ad_badge_view);
// 必选项:绑定俄罗斯合规版本 免责声明
AdDisclaimerView adDisclaimerView = adView.findViewById(R.id.ad_disclaimer_view);

nativeView.destroy();

// 设置icon控件
nativeView.setIconView(icon);
// 设置广告主图控件
nativeView.setMediaView(mediaView, ImageView.ScaleType.FIT_XY);
// 设置广告⻆标控件
nativeView.setAdChoiceView(adChoicesView);
// 设置广告关闭控件
nativeView.setAdCloseView(adCloseView);
// 必选项:设置应用商店标识控件
nativeView.setPsMarkView(storeMarkView);
// 必选项:设置俄罗斯合规版本 AD 角标
nativeView.setAdBagdeView(adBadgeView);
// 必选项:设置俄罗斯合规版本 免责声明
nativeView.setAdDisclaimerView(adDisclaimerView);

// 添加广告视图
nativeView.addView(adView);

title.setText(adNativeInfo.getTitle());
des.setText(adNativeInfo.getDescription());
calltoaction.setText(adNativeInfo.getCtatext());

if (!TextUtils.isEmpty(adNativeInfo.getRating())) {
rating.setText("R : " + adNativeInfo.getRating());
}

List<View> adContains = new ArrayList<>();
adContains.add(title);
adContains.add(icon);
adContains.add(mediaView);
adContains.add(calltoaction);
adContains.add(des);
adContains.add(adView);
adContains.add(adCloseView);
adContains.add(storeMarkView);
nativeView.setupViews(adNativeInfo);
tNativeAd.registerViews(nativeView, adContains, adNativeInfo);
}

提醒:关于Icon广告,一般处理方式为设置icon、calltoaction,具体请根据需求来设定。

模版渲染

private void inflateView(TaNativeInfo adNativeInfo, TNative nativeAd, TNativeView nativeView) {
// 模版对象
TemplateStyle templateStyle;
// Boolean类型:"isChangeStyle"
if (isChangeStyle) {
// 可自行对模块进行微调
templateStyle = new TemplateStyle.Builder()
.titleSize(20).titleColor(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).isTitleBold(0)
.descColor(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).descSize(20).isDescBold(1)
.callToAction_text_color(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).callToAction_text_isBold(1).callToAction_text_size(20)
.callToAction_background_color(CoreUtil.getContext().getResources().getColor(R.color.ad_button_bg_color))
.callToAction_corner_radius(0).callToAction_stroke_color(CoreUtil.getContext().getResources()
}.getColor(R.color.hisavana_ad_color_0051E1)).callToAction_stroke_width(5)
//.callToAction_background_shape(CoreUtil.getContext().getResources().getDrawable(R.drawable.hisavana_bg_shadow))
.background(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_787878))
.build();
} else {
// 采用默认模版
templateStyle = new TemplateStyle.Builder().build();
}
nativeView.setTemplateStyle(templateStyle);
nativeAd.registerViews(nativeView, adNativeInfo);
}

媒体配置平台设置