メインコンテンツへスキップ

概要

ネイティブ広告は、アプリのデザインに合わせて広告UIを自由にカスタマイズできる広告フォーマットです。広告素材(画像、動画)、タイトル、説明、CTAボタンなどの要素を個別に配置して、自然なユーザー体験を提供できます。

主な機能

  • 完全なUIカスタマイズ:アプリのデザインシステムに合わせて広告レイアウトを自由に構成
  • 様々なメディアサポート:画像および動画広告素材サポート
  • 柔軟なクリック領域設定:全体クリックまたは個別要素別クリック処理可能
  • プロフィール情報表示:広告主プロフィールロゴ、名前、リンクサポート

クラスとインターフェース

AdropNativeAd

ネイティブ広告をロードして管理するメインクラスです。
unitId
String
required
広告枠ID(コンソールで発行)
contextId
String
コンテキストターゲティング用のID(オプション)
listener
AdropNativeAdListener
広告イベントを処理するリスナー
useCustomClick
Boolean
default:"false"
カスタムクリック処理使用有無

主なプロパティ

プロパティタイプ説明
headlineString広告タイトル
bodyString広告本文
iconStringアイコン画像URL
coverStringカバー画像URL
advertiserString広告主名
callToActionString行動喚起文言(例:「今すぐ確認」)
profileAdropNativeAdProfile広告主プロフィール情報
isLoadedBoolean広告ロード完了状態
isDestroyedBoolean広告削除状態

AdropNativeAdView

ネイティブ広告を表示するコンテナビューです。
isEntireClick
Boolean
default:"false"
全体領域クリック有効化有無。trueに設定すると広告ビュー全体領域でクリックイベントが発生します。

主なメソッド

メソッド説明
setIconView(view, listener)アイコン画像ビュー設定(ImageViewタイプ)
setHeadLineView(view, listener)タイトルテキストビュー設定(TextViewタイプ)
setBodyView(view)本文テキストビュー設定(TextViewタイプ)
setMediaView(view)メディアコンテナビュー設定(AdropMediaViewタイプ)
setAdvertiserView(view, listener)広告主名テキストビュー設定(TextViewタイプ)
setCallToActionView(view)CTAボタンまたはテキストビュー設定
setProfileLogoView(view, listener)プロフィールロゴ画像ビュー設定(ImageViewタイプ)
setProfileNameView(view, listener)プロフィール名テキストビュー設定(TextViewタイプ)
setNativeAd(ad)広告データをビューにバインド
destroy()リソース解放

AdropMediaView

広告画像または動画を表示するメディアコンテナビューです。
<io.adrop.ads.nativeAd.AdropMediaView
    android:id="@+id/ad_media"
    android:layout_width="match_parent"
    android:layout_height="200dp" />

AdropNativeAdListener

広告イベントを処理するインターフェースです。
interface AdropNativeAdListener {
    fun onAdReceived(ad: AdropNativeAd)
    fun onAdClick(ad: AdropNativeAd)
    fun onAdFailedToReceive(ad: AdropNativeAd, errorCode: AdropErrorCode)
    fun onAdImpression(ad: AdropNativeAd) // オプション実装
}

AdropNativeAdProfile

広告主プロフィール情報を含むデータクラスです。
プロパティタイプ説明
displayLogoStringプロフィールロゴ画像URL
displayNameStringプロフィール表示名
linkStringプロフィールリンクURL

実装ガイド

1. XMLレイアウト設定

ネイティブ広告を表示するレイアウトを定義します。AdropNativeAdViewをルートとして、内部に広告要素を配置します。
res/layout/native_ad_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<io.adrop.ads.nativeAd.AdropNativeAdView
    android:id="@+id/native_ad_view"
    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="wrap_content">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp">

        <!-- プロフィール領域 -->
        <ImageView
            android:id="@+id/ad_profile_logo"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:scaleType="centerCrop"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/ad_profile_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:textSize="16sp"
            android:textStyle="bold"
            app:layout_constraintStart_toEndOf="@id/ad_profile_logo"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/ad_badge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="4dp"
            android:text="広告"
            android:textSize="12sp"
            app:layout_constraintStart_toEndOf="@id/ad_profile_logo"
            app:layout_constraintTop_toBottomOf="@id/ad_profile_name" />

        <!-- メディア領域 -->
        <io.adrop.ads.nativeAd.AdropMediaView
            android:id="@+id/ad_media"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_marginTop="12dp"
            app:layout_constraintTop_toBottomOf="@id/ad_profile_logo" />

        <!-- 広告コンテンツ -->
        <TextView
            android:id="@+id/ad_headline"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            android:textSize="18sp"
            android:textStyle="bold"
            app:layout_constraintTop_toBottomOf="@id/ad_media" />

        <TextView
            android:id="@+id/ad_body"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:textSize="14sp"
            app:layout_constraintTop_toBottomOf="@id/ad_headline" />

        <!-- 下部領域 -->
        <TextView
            android:id="@+id/ad_advertiser"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/ad_body" />

        <Button
            android:id="@+id/ad_call_to_action"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@id/ad_body" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</io.adrop.ads.nativeAd.AdropNativeAdView>

2. 広告のロードと表示(Kotlin)

import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import io.adrop.ads.model.AdropErrorCode
import io.adrop.ads.nativeAd.AdropMediaView
import io.adrop.ads.nativeAd.AdropNativeAd
import io.adrop.ads.nativeAd.AdropNativeAdListener
import io.adrop.ads.nativeAd.AdropNativeAdView

class NativeAdActivity : AppCompatActivity() {

    private lateinit var nativeAd: AdropNativeAd
    private lateinit var nativeAdView: AdropNativeAdView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_native_ad)

        nativeAdView = findViewById(R.id.native_ad_view)
        loadNativeAd()
    }

    private fun loadNativeAd() {
        // 1. ネイティブ広告インスタンス作成
        nativeAd = AdropNativeAd(
            context = this,
            unitId = "YOUR_UNIT_ID"  // 実際のユニットIDに置き換え
        )

        // 2. リスナー設定
        nativeAd.listener = object : AdropNativeAdListener {
            override fun onAdReceived(ad: AdropNativeAd) {
                Log.d("Adrop", "広告受信成功")
                populateNativeAdView(ad)
            }

            override fun onAdFailedToReceive(ad: AdropNativeAd, errorCode: AdropErrorCode) {
                Log.e("Adrop", "広告受信失敗:$errorCode")
            }

            override fun onAdClick(ad: AdropNativeAd) {
                Log.d("Adrop", "広告クリック")
            }

            override fun onAdImpression(ad: AdropNativeAd) {
                Log.d("Adrop", "広告インプレッション")
            }
        }

        // 3. 広告ロード
        nativeAd.load()
    }

    private fun populateNativeAdView(ad: AdropNativeAd) {
        // プロフィール設定
        val profileLogoView = findViewById<ImageView>(R.id.ad_profile_logo)
        Glide.with(this).load(ad.profile.displayLogo).into(profileLogoView)
        nativeAdView.setProfileLogoView(profileLogoView)

        val profileNameView = findViewById<TextView>(R.id.ad_profile_name)
        profileNameView.text = ad.profile.displayName
        nativeAdView.setProfileNameView(profileNameView)

        // タイトル設定
        val headlineView = findViewById<TextView>(R.id.ad_headline)
        headlineView.text = ad.headline
        nativeAdView.setHeadLineView(headlineView)

        // メディア設定
        val mediaView = findViewById<AdropMediaView>(R.id.ad_media)
        nativeAdView.setMediaView(mediaView)

        // 本文設定
        val bodyView = findViewById<TextView>(R.id.ad_body)
        bodyView.text = ad.body
        nativeAdView.setBodyView(bodyView)

        // 広告主設定
        val advertiserView = findViewById<TextView>(R.id.ad_advertiser)
        advertiserView.text = ad.advertiser
        nativeAdView.setAdvertiserView(advertiserView)

        // CTAボタン設定
        val ctaView = findViewById<Button>(R.id.ad_call_to_action)
        ctaView.text = ad.callToAction
        nativeAdView.setCallToActionView(ctaView)

        // 広告データバインド
        nativeAdView.setNativeAd(ad)
    }

    override fun onDestroy() {
        // リソース解放
        nativeAdView.destroy()
        nativeAd.destroy()
        super.onDestroy()
    }
}

3. 広告のロードと表示(Java)

Java
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.bumptech.glide.Glide;
import io.adrop.ads.model.AdropErrorCode;
import io.adrop.ads.nativeAd.AdropMediaView;
import io.adrop.ads.nativeAd.AdropNativeAd;
import io.adrop.ads.nativeAd.AdropNativeAdListener;
import io.adrop.ads.nativeAd.AdropNativeAdView;

public class NativeAdActivity extends AppCompatActivity {

    private AdropNativeAd nativeAd;
    private AdropNativeAdView nativeAdView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_native_ad);

        nativeAdView = findViewById(R.id.native_ad_view);
        loadNativeAd();
    }

    private void loadNativeAd() {
        // 1. ネイティブ広告インスタンス作成
        nativeAd = new AdropNativeAd(
            this,
            "YOUR_UNIT_ID",  // 実際のユニットIDに置き換え
            null  // contextId(オプション)
        );

        // 2. リスナー設定
        nativeAd.setListener(new AdropNativeAdListener() {
            @Override
            public void onAdReceived(AdropNativeAd ad) {
                Log.d("Adrop", "広告受信成功");
                populateNativeAdView(ad);
            }

            @Override
            public void onAdFailedToReceive(AdropNativeAd ad, AdropErrorCode errorCode) {
                Log.e("Adrop", "広告受信失敗:" + errorCode);
            }

            @Override
            public void onAdClick(AdropNativeAd ad) {
                Log.d("Adrop", "広告クリック");
            }

            @Override
            public void onAdImpression(AdropNativeAd ad) {
                Log.d("Adrop", "広告インプレッション");
            }
        });

        // 3. 広告ロード
        nativeAd.load();
    }

    private void populateNativeAdView(AdropNativeAd ad) {
        // プロフィールロゴ設定
        ImageView profileLogoView = findViewById(R.id.ad_profile_logo);
        Glide.with(this).load(ad.getProfile().getDisplayLogo()).into(profileLogoView);
        nativeAdView.setProfileLogoView(profileLogoView, null);

        // プロフィール名設定
        TextView profileNameView = findViewById(R.id.ad_profile_name);
        profileNameView.setText(ad.getProfile().getDisplayName());
        nativeAdView.setProfileNameView(profileNameView, null);

        // タイトル設定
        TextView headlineView = findViewById(R.id.ad_headline);
        headlineView.setText(ad.getHeadline());
        nativeAdView.setHeadLineView(headlineView, null);

        // メディア設定
        AdropMediaView mediaView = findViewById(R.id.ad_media);
        nativeAdView.setMediaView(mediaView);

        // 本文設定
        TextView bodyView = findViewById(R.id.ad_body);
        bodyView.setText(ad.getBody());
        nativeAdView.setBodyView(bodyView);

        // 広告主設定
        TextView advertiserView = findViewById(R.id.ad_advertiser);
        advertiserView.setText(ad.getAdvertiser());
        nativeAdView.setAdvertiserView(advertiserView, null);

        // CTAボタン設定
        Button ctaView = findViewById(R.id.ad_call_to_action);
        ctaView.setText(ad.getCallToAction());
        nativeAdView.setCallToActionView(ctaView);

        // 広告データバインド
        nativeAdView.setNativeAd(ad);
    }

    @Override
    protected void onDestroy() {
        // リソース解放
        if (nativeAdView != null) {
            nativeAdView.destroy();
        }
        if (nativeAd != null) {
            nativeAd.destroy();
        }
        super.onDestroy();
    }
}

高度な機能

全体クリック領域設定

広告ビュー全体領域でクリックイベントが発生するよう設定できます。
nativeAdView.isEntireClick = true
isEntireClicktrueに設定すると広告ビュー全体がクリック可能な領域になります。個別要素のクリックリスナーは動作しません。

個別要素クリックリスナー

特定の広告要素にカスタムクリックリスナーを設定できます。
// 広告主クリック時のカスタム動作
nativeAdView.setAdvertiserView(advertiserView) {
    Log.d("Adrop", "広告主クリック")
    // カスタム動作実装
}

// プロフィールロゴクリック時のカスタム動作
nativeAdView.setProfileLogoView(profileLogoView) {
    Log.d("Adrop", "プロフィールロゴクリック")
    // カスタム動作実装
}

コンテキストターゲティング

特定のコンテキストに合った広告をリクエストできます。
val nativeAd = AdropNativeAd(
    context = this,
    unitId = "YOUR_UNIT_ID",
    contextId = "SPORTS_NEWS"  // コンテキストID
)

RecyclerViewでの使用

RecyclerViewのアイテムとしてネイティブ広告を表示できます。
RecyclerView Adapter
class ContentAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    companion object {
        const val VIEW_TYPE_CONTENT = 0
        const val VIEW_TYPE_AD = 1
        const val AD_INTERVAL = 5  // 5アイテムごとに広告表示
    }

    private val items = mutableListOf<Any>()
    private val nativeAds = mutableMapOf<Int, AdropNativeAd>()

    override fun getItemViewType(position: Int): Int {
        return if (position % (AD_INTERVAL + 1) == AD_INTERVAL) {
            VIEW_TYPE_AD
        } else {
            VIEW_TYPE_CONTENT
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when (viewType) {
            VIEW_TYPE_AD -> {
                val view = LayoutInflater.from(parent.context)
                    .inflate(R.layout.item_native_ad, parent, false)
                NativeAdViewHolder(view)
            }
            else -> {
                val view = LayoutInflater.from(parent.context)
                    .inflate(R.layout.item_content, parent, false)
                ContentViewHolder(view)
            }
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is NativeAdViewHolder -> loadNativeAd(holder, position)
            is ContentViewHolder -> holder.bind(items[position])
        }
    }

    private fun loadNativeAd(holder: NativeAdViewHolder, position: Int) {
        // 既にロードした広告があれば再利用
        nativeAds[position]?.let { ad ->
            if (ad.isLoaded) {
                holder.bind(ad)
                return
            }
        }

        // 新しい広告をロード
        val nativeAd = AdropNativeAd(holder.itemView.context, "YOUR_UNIT_ID")
        nativeAd.listener = object : AdropNativeAdListener {
            override fun onAdReceived(ad: AdropNativeAd) {
                nativeAds[position] = ad
                holder.bind(ad)
            }

            override fun onAdFailedToReceive(ad: AdropNativeAd, errorCode: AdropErrorCode) {
                Log.e("Adrop", "広告ロード失敗:$errorCode")
            }

            override fun onAdClick(ad: AdropNativeAd) {
                Log.d("Adrop", "広告クリック")
            }
        }
        nativeAd.load()
    }

    class NativeAdViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val nativeAdView: AdropNativeAdView = itemView.findViewById(R.id.native_ad_view)

        fun bind(ad: AdropNativeAd) {
            val profileLogo = itemView.findViewById<ImageView>(R.id.ad_profile_logo)
            Glide.with(itemView.context).load(ad.profile.displayLogo).into(profileLogo)
            nativeAdView.setProfileLogoView(profileLogo)

            val profileName = itemView.findViewById<TextView>(R.id.ad_profile_name)
            profileName.text = ad.profile.displayName
            nativeAdView.setProfileNameView(profileName)

            val headline = itemView.findViewById<TextView>(R.id.ad_headline)
            headline.text = ad.headline
            nativeAdView.setHeadLineView(headline)

            val media = itemView.findViewById<AdropMediaView>(R.id.ad_media)
            nativeAdView.setMediaView(media)

            val body = itemView.findViewById<TextView>(R.id.ad_body)
            body.text = ad.body
            nativeAdView.setBodyView(body)

            val advertiser = itemView.findViewById<TextView>(R.id.ad_advertiser)
            advertiser.text = ad.advertiser
            nativeAdView.setAdvertiserView(advertiser)

            val cta = itemView.findViewById<Button>(R.id.ad_call_to_action)
            cta.text = ad.callToAction
            nativeAdView.setCallToActionView(cta)

            nativeAdView.setNativeAd(ad)
        }
    }

    fun destroy() {
        nativeAds.values.forEach { it.destroy() }
        nativeAds.clear()
    }
}

テストユニットID

開発およびテスト時に以下のテストユニットIDを使用してください。
フォーマットテストユニットID
ネイティブ(画像)PUBLIC_TEST_UNIT_ID_NATIVE
ネイティブ動画(16:9)PUBLIC_TEST_UNIT_ID_NATIVE_VIDEO_16_9
ネイティブ動画(9:16)PUBLIC_TEST_UNIT_ID_NATIVE_VIDEO_9_16
本番リリース前に必ず実際のユニットIDに置き換えてください。

ライフサイクル管理

Activity/Fragmentでのリソース解放

ネイティブ広告はメモリリークを防ぐために使用終了後に必ず解放する必要があります。
override fun onDestroy() {
    nativeAdView.destroy()
    nativeAd.destroy()
    super.onDestroy()
}

RecyclerViewでのリソース解放

RecyclerView Adapterで広告を使用する場合、ActivityやFragmentが終了する時にすべての広告を解放する必要があります。
override fun onDestroy() {
    adapter.destroy()
    super.onDestroy()
}

ベストプラクティス

1. 必要な要素のみ表示

すべての広告要素を表示する必要はありません。アプリのデザインに合わせて必要な要素のみ選択的に使用してください。
// 最小構成例(メディア + CTAのみ使用)
nativeAdView.setMediaView(mediaView)
nativeAdView.setCallToActionView(ctaView)
nativeAdView.setNativeAd(ad)

2. 画像ロードライブラリの使用

アイコン、カバー、プロフィール画像を表示する際はGlide、Coilなどの画像ロードライブラリを使用してください。
// Glide使用例
Glide.with(context)
    .load(ad.icon)
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .into(iconView)

3. 広告ビューの再利用

RecyclerViewで広告を表示する際は広告インスタンスをキャッシュして再利用してください。

4. 適切な広告配置

ユーザー体験を損なわない範囲で自然に広告を配置してください。
  • コンテンツフィード:5〜10アイテムごとに1つの広告
  • 詳細画面:コンテンツ下部に配置
  • スクロールビュー:自然なコンテンツフローに合わせて配置

5. エラー処理

広告ロード失敗に備えて適切なフォールバック処理を実装してください。
override fun onAdFailedToReceive(ad: AdropNativeAd, errorCode: AdropErrorCode) {
    when (errorCode) {
        AdropErrorCode.ERROR_CODE_AD_NO_FILL -> {
            // 広告なし - 広告領域を非表示
            nativeAdView.visibility = View.GONE
        }
        AdropErrorCode.ERROR_CODE_NETWORK -> {
            // ネットワークエラー - リトライロジック
            Handler(Looper.getMainLooper()).postDelayed({
                nativeAd.load()
            }, 3000)
        }
        else -> {
            Log.e("Adrop", "広告ロード失敗:$errorCode")
        }
    }
}

完全な例

import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import io.adrop.ads.model.AdropErrorCode
import io.adrop.ads.nativeAd.AdropMediaView
import io.adrop.ads.nativeAd.AdropNativeAd
import io.adrop.ads.nativeAd.AdropNativeAdListener
import io.adrop.ads.nativeAd.AdropNativeAdView

class NativeAdExampleActivity : AppCompatActivity() {

    private lateinit var nativeAd: AdropNativeAd
    private lateinit var nativeAdView: AdropNativeAdView
    private lateinit var loadingView: View
    private lateinit var errorView: View

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_native_ad_example)

        nativeAdView = findViewById(R.id.native_ad_view)
        loadingView = findViewById(R.id.loading_view)
        errorView = findViewById(R.id.error_view)

        findViewById<Button>(R.id.retry_button).setOnClickListener {
            loadNativeAd()
        }

        loadNativeAd()
    }

    private fun loadNativeAd() {
        showLoading()

        nativeAd = AdropNativeAd(
            context = this,
            unitId = "PUBLIC_TEST_UNIT_ID_NATIVE"
        )

        nativeAd.listener = object : AdropNativeAdListener {
            override fun onAdReceived(ad: AdropNativeAd) {
                Log.d("Adrop", "広告受信:unitId=${ad.unitId}, txId=${ad.txId}")
                populateNativeAdView(ad)
                showAd()
            }

            override fun onAdFailedToReceive(ad: AdropNativeAd, errorCode: AdropErrorCode) {
                Log.e("Adrop", "広告受信失敗:$errorCode")
                showError()
            }

            override fun onAdClick(ad: AdropNativeAd) {
                Log.d("Adrop", "広告クリック:txId=${ad.txId}")
            }

            override fun onAdImpression(ad: AdropNativeAd) {
                Log.d("Adrop", "広告インプレッション:txId=${ad.txId}")
            }
        }

        nativeAd.load()
    }

    private fun populateNativeAdView(ad: AdropNativeAd) {
        // 全体クリック領域を有効化(オプション)
        // nativeAdView.isEntireClick = true

        // プロフィールロゴ
        val profileLogoView = findViewById<ImageView>(R.id.ad_profile_logo)
        Glide.with(this)
            .load(ad.profile.displayLogo)
            .circleCrop()
            .into(profileLogoView)
        nativeAdView.setProfileLogoView(profileLogoView)

        // プロフィール名
        val profileNameView = findViewById<TextView>(R.id.ad_profile_name)
        profileNameView.text = ad.profile.displayName
        nativeAdView.setProfileNameView(profileNameView)

        // タイトル
        val headlineView = findViewById<TextView>(R.id.ad_headline)
        headlineView.text = ad.headline
        nativeAdView.setHeadLineView(headlineView)

        // メディア(画像または動画)
        val mediaView = findViewById<AdropMediaView>(R.id.ad_media)
        nativeAdView.setMediaView(mediaView)

        // 本文
        val bodyView = findViewById<TextView>(R.id.ad_body)
        bodyView.text = ad.body
        nativeAdView.setBodyView(bodyView)

        // 広告主
        val advertiserView = findViewById<TextView>(R.id.ad_advertiser)
        advertiserView.text = ad.advertiser
        nativeAdView.setAdvertiserView(advertiserView) {
            Log.d("Adrop", "広告主クリック:${ad.advertiser}")
        }

        // CTAボタン
        val ctaView = findViewById<Button>(R.id.ad_call_to_action)
        ctaView.text = ad.callToAction
        nativeAdView.setCallToActionView(ctaView)

        // 広告データバインド
        nativeAdView.setNativeAd(ad)
    }

    private fun showLoading() {
        loadingView.visibility = View.VISIBLE
        nativeAdView.visibility = View.GONE
        errorView.visibility = View.GONE
    }

    private fun showAd() {
        loadingView.visibility = View.GONE
        nativeAdView.visibility = View.VISIBLE
        errorView.visibility = View.GONE
    }

    private fun showError() {
        loadingView.visibility = View.GONE
        nativeAdView.visibility = View.GONE
        errorView.visibility = View.VISIBLE
    }

    override fun onDestroy() {
        nativeAdView.destroy()
        nativeAd.destroy()
        super.onDestroy()
    }
}

次のステップ