Search...
Menu

Native Ads

💡Tips

  • 🚀 Use preloading mechanism to enhance UX
  • ⚠️ Handle lifecycle properly to prevent memory leaks
  • 🔧 Recommended to use standardized callback workflow

java Copy
// Recommended global variables  
private MCAdInfo mMCAdInfo;  
private MCNativeAdView mMCNativeAdView;  
private MCNativeAd mMCNativeAd;  

MCNativeAdLoader mNativeAdLoader = new MCNativeAdLoader(activity, "your mediation unit id");  
mNativeAdLoader.setNativeAdListener(new MCNativeAdListener() {  
    @Override  
    public void onAdLoaded(MCNativeAdView nativeAdView, MCAdInfo adInfo) {  
        // Ad load success callback  
        if (mMCNativeAd != null) {  
            mNativeAdLoader.destroy(mMCNativeAd);  
        }  
        mMCAdInfo = adInfo;  
        mMCNativeAd = adInfo.getNativeAd();  
        mMCNativeAdView = nativeAdView;  
        // Reset retry attempt
        retryAttempt = 0;
    }  
    
    @Override  
    public void onAdLoadFailed(MCError mcError) {  
        // Ad load failure callback  
        // We recommends that you retry with exponentially higher delays up to a maximum delay (in this case 8 seconds) or the maximum number of retries (in this case 3)
        if (retryAttempt >= 3) return;
        retryAttempt++;
        long delayMillis = TimeUnit.SECONDS.toMillis((long) Math.pow(2, Math.min(3, retryAttempt)));
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mNativeAdLoader.loadAd();
            }
        }, delayMillis);
    }  

    @Override  
    public void onAdDisplayed(MCAdInfo adInfo) {  
        // Ad display success callback  
    }  

    @Override  
    public void onAdHidden(MCAdInfo adInfo) {  
        // Ad closed callback  
    }  

    @Override  
    public void onAdClicked(MCAdInfo adInfo) {  
        // Ad click callback  
    }  
});  

mNativeAdLoader.setRevenueListener(new MCAdRevenueListener() {  
    @Override  
    public void onAdRevenuePaid(MCAdInfo adInfo) {  
        // Revenue tracking callback  
    }  
});  

mNativeAdLoader.loadAd();

java Copy
// Parent container for NativeAdView  
FrameLayout mNativeAdViewContainer = findViewById(R.id.adview_container);  
mNativeAdViewContainer.removeAllViews();  

if (mMCNativeAd != null) {  
    if (mMCNativeAd.isTemplateNativeAd()) {  
        // Template rendering  
        mNativeAdViewContainer.addView(mMCNativeAdView);  
    } else {  
        // Self-rendering  
        mMCNativeAdView = createNativeAdView();  
        mNativeAdViewContainer.addView(mMCNativeAdView);  
        mNativeAdLoader.render(mMCNativeAdView, mMCAdInfo);  
    }  
} else {  
    // No cached ads available, reload recommended  
    mNativeAdLoader.loadAd();  
}  

private MCNativeAdView createNativeAdView() {  
    // Custom XML components must match the following identifiers  
    MCNativeAdViewBinder binder = new MCNativeAdViewBinder.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 
        //  .setWarningViewId(R.id.body_warn_view)  (Only Yandex need) //TextView
        //  .setSponserViewId(R.id.body_spon_view)  (Only Yandex need) //TextView
            .build();  
    return new MCNativeAdView(binder, activity);  
}  
📌 native_custom_ad_view.xml
xml Copy
<?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>

3. Resource Release

java Copy
if (mNativeAdLoader != null) {  
    mNativeAdLoader.destroy();  
    if (mMCNativeAd != null) {  
        mNativeAdLoader.destroy(mMCNativeAd);  
    }  
}  

4. Customized Parameter Configuration

java Copy
MCNativeAdLoader mNativeAdLoader = new MCNativeAdLoader(activity, "your mediation unit id");  
Map<String, Object> loadExtraParameter = new HashMap<>();  
loadExtraParameter.put("test_load_extra_key", "test_load_extra_value");  
mNativeAdLoader.setLoadExtraParameter(loadExtraParameter);  

Map<String, String> extraParameter = new HashMap<>();  
extraParameter.put("test_extra_key", "test_extra_value");  
mNativeAdLoader.setExtraParameter(extraParameter);  

mNativeAdLoader.setNativeAdListener(new MCNativeAdListener() {  
    ...  
    @Override  
    public void onAdLoaded(MCNativeAdView mcNativeAdView, MCAdInfo adInfo) {  
        // Retrieve custom parameters  
        adInfo.getOriginJsonString();  
    }  
    ...  
});  

mNativeAdLoader.loadAd();  
Previous
Banner Ads
Next
The Callback Info
Last modified: 2025-07-11Powered by