💡Tips
- 🚀 采用预加载机制提升用户体验
- ⚠️ 注意处理生命周期防止内存泄漏
- 🔧 推荐使用标准化回调处理流程
// 建议使用全局 mDTGAdInfo,mDTGNativeAdView 和 mDTGNativeAd
private DTGAdInfo mDTGAdInfo;
private DTGNativeAdView mDTGNativeAdView;
private DTGNativeAd mDTGNativeAd;
DTGNativeAdLoader mNativeAdLoader = new DTGNativeAdLoader(activity, "your placement id");
mNativeAdLoader.setNativeAdListener(new DTGNativeAdListener() {
@Override
public void onAdLoaded(DTGNativeAdView nativeAdView, DTGAdInfo adInfo) {
// 加载成功回调
if (mDTGNativeAd != null) {
mNativeAdLoader.destroy(mDTGNativeAd);
}
mDTGAdInfo = adInfo;
mDTGNativeAd = adInfo.getNativeAd();
mDTGNativeAdView = nativeAdView;
}
@Override
public void onAdLoadFailed(DTGError dtgError) {
// 加载失败回调
// 需延迟2S/4S/8S...再次加载重试有限次(禁止在此循环重试加载)
mNativeAdLoader.loadAd();
}
@Override
public void onAdDisplayed(DTGAdInfo adInfo) {
// 展示成功回调
}
@Override
public void onAdHidden(DTGAdInfo adInfo) {
// 广告关闭回调
}
@Override
public void onAdClicked(DTGAdInfo adInfo) {
// 触发点击回调
}
});
mNativeAdLoader.setRevenueListener(new DTGAdRevenueListener() {
@Override
public void onAdRevenuePaid(DTGAdInfo adInfo) {
// 可在此回调获取广告收益
}
});
mNativeAdLoader.loadAd();
// NativeAdView的父容器
FrameLayout mNativeAdViewContainer = findViewById(R.id.adview_container);
mNativeAdViewContainer.removeAllViews();
if (mDTGNativeAd != null) {
if (mDTGNativeAd.isTemplateNativeAd()) {
// 模板渲染
mNativeAdViewContainer.addView(mDTGNativeAdView);
} else {
//自渲染
mDTGNativeAdView = createNativeAdView();
mNativeAdViewContainer.addView(mDTGNativeAdView);
mNativeAdLoader.render(mDTGNativeAdView, mDTGAdInfo);
}
} else {
// 当前广告位没有可用缓存,建议重新加载
mNativeAdLoader.loadAd();
}
private DTGNativeAdView createNativeAdView() {
// 自定义xml文件中各组件类型需和下列标识的保持一致
DTGNativeAdViewBinder binder = new DTGNativeAdViewBinder.Builder(R.layout.native_custom_ad_view)
// 可根据业务需要选择下面各组件进行设置渲染,建议添加下面所有组件
.setTitleTextViewId(R.id.title_text_view) //TextView
.setBodyTextViewId(R.id.body_text_view) //TextView
.setStarRatingContentViewGroupId(R.id.star_rating_view) //ViewGroup
.setAdvertiserTextViewId(R.id.advertiser_text_view) //TextView
.setIconImageViewId(R.id.icon_image_view) //ImageView
.setMediaContentViewGroupId(R.id.media_view_container) //ViewGroup
.setOptionsContentViewGroupId(R.id.options_view) //ViewGroup
.setCallToActionButtonId(R.id.cta_button) //Button
.build();
return new DTGNativeAdView(binder, activity);
}
📌 native_custom_ad_view.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxHeight="300dp"
android:padding="8dp">
<ImageView
android:id="@+id/icon_image_view"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:background="#ff669900"
android:padding="2dp"
android:text="Ad"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="@+id/title_text_view"
app:layout_constraintStart_toEndOf="@+id/icon_image_view"
app:layout_constraintTop_toTopOf="@+id/title_text_view" />
<FrameLayout
android:id="@+id/options_view"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginBottom="8dp"
android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@+id/advertiser_text_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/title_text_view"
app:layout_constraintTop_toTopOf="@+id/icon_image_view" />
<TextView
android:id="@+id/title_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
app:layout_constraintStart_toEndOf="@+id/text_view"
app:layout_constraintTop_toTopOf="parent"
tools:text="Title" />
<TextView
android:id="@+id/advertiser_text_view"
android:layout_width="wrap_content"
android:layout_height="8dp"
android:layout_marginStart="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="@+id/icon_image_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/icon_image_view"
app:layout_constraintTop_toBottomOf="@+id/title_text_view"
app:layout_constraintVertical_bias="1.0"
tools:text="Advertiser" />
<FrameLayout
android:id="@+id/star_rating_view"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="4dp"
app:layout_constraintBottom_toTopOf="@id/advertiser_text_view"
app:layout_constraintStart_toStartOf="@id/text_view"
app:layout_constraintTop_toBottomOf="@id/text_view" />
<TextView
android:id="@+id/body_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/icon_image_view"
tools:text="Body" />
<FrameLayout
android:id="@+id/media_view_container"
android:layout_width="0dp"
android:layout_height="150dp"
android:layout_marginTop="4dp"
android:maxHeight="150dp"
app:layout_constraintDimensionRatio="W,16:9"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/body_text_view" />
<Button
android:id="@+id/cta_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:backgroundTint="#0583aa"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/media_view_container"
tools:layout_editor_absoluteX="8dp"
tools:text="Install" />
</androidx.constraintlayout.widget.ConstraintLayout>
if (mNativeAdLoader != null) {
mNativeAdLoader.destroy();
if (mDTGNativeAd != null) {
mNativeAdLoader.destroy(mDTGNativeAd);
}
}