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);
}
媒体配置平台设置
