Display a NativeAd
When a native ad loads, the Google Mobile Ads SDK invokes the listener for the corresponding ad format. Your app is then responsible for displaying the ad, though it doesn't necessarily have to do so immediately. To make displaying system-defined ad formats easier, the SDK offers some useful resources, as described below.
NativeAdView
class
For the NativeAd
format, there is the corresponding
NativeAdView
class. This class is a
ViewGroup
that publishers should use as the root for the NativeAd
. A
single NativeAdView
corresponds to a single native ad.
Each view used to display that ad's assets (the ImageView
that displays the
screenshot asset, for instance) should be a child of the NativeAdView
object.
The view hierarchy for a native ad that uses a
LinearLayout
to display its asset views might look like this:
<com.google.android.gms.ads.nativead.NativeAdView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal">
<ImageView
android:id="@+id/ad_app_icon" />
<TextView
android:id="@+id/ad_headline" />
</LinearLayout>
<!--Add remaining assets such as the image and media view.-->
</LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
Here is an example that creates a NativeAdView
and
populates it with a NativeAd
:
Java
AdLoader.Builder builder = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
.forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
@Override
public void onNativeAdLoaded(NativeAd nativeAd) {
// Assumes you have a placeholder FrameLayout in your View layout
// (with ID fl_adplaceholder) where the ad is to be placed.
FrameLayout frameLayout =
findViewById(R.id.fl_adplaceholder);
// Assumes that your ad layout is in a file call native_ad_layout.xml
// in the res/layout folder
NativeAdView adView = (NativeAdView) getLayoutInflater()
.inflate(R.layout.native_ad_layout, null);
// This method sets the assets into the ad view.
populateNativeAdView(nativeAd, adView);
frameLayout.removeAllViews();
frameLayout.addView(adView);
}
});
Kotlin
val builder = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
.forNativeAd { nativeAd ->
// Assumes you have a placeholder FrameLayout in your View layout
// (with ID fl_adplaceholder) where the ad is to be placed.
val frameLayout: FrameLayout = findViewById(R.id.fl_adplaceholder)
// Assumes that your ad layout is in a file call native_ad_layout.xml
// in the res/layout folder
val adView = layoutInflater
.inflate(R.layout.native_ad_layout, null) as NativeAdView
// This method sets the assets into the ad view.
populateNativeAdView(nativeAd, adView)
frameLayout.removeAllViews()
frameLayout.addView(adView)
}
Note that all assets for a given native ad should be rendered inside the
NativeAdView
layout. The Google Mobile Ads SDK attempts to log a warning when
native assets are rendered outside of a native ad view layout.
The ad view classes also provide methods used to register the view used for
each individual asset, and one to register the NativeAd
object itself.
Registering the views in this way allows the SDK to automatically handle tasks
such as:
- Recording clicks
- Recording impressions when the first pixel is visible on the screen
- Displaying the AdChoices overlay
AdChoices overlay
An AdChoices overlay is added to each ad view by the SDK. Leave space in your preferred corner of your native ad view for the automatically inserted AdChoices logo. Also, it's important that the AdChoices overlay be easily seen, so choose background colors and images appropriately. For more information on the overlay's appearance and function, see Native ads field descriptions.
Ad attribution
You must display an ad attribution to denote that the view is an advertisement. Learn more in our policy guidelines.
Code example
These are the steps for displaying a native ad:
- Create an instance of the
NativeAdView
class. For each ad asset to be displayed:
- Populate the asset view with the asset in the ad object.
- Register the asset view with the
NativeAdView
class.
Register the
MediaView
if your native ad layout includes a large media asset.Register the ad object with the
NativeAdView
class.
Here is an example function that displays a NativeAd
:
Java
private void displayNativeAd(ViewGroup parent, NativeAd ad) {
// Inflate a layout and add it to the parent ViewGroup.
LayoutInflater inflater = (LayoutInflater) parent.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
NativeAdView adView = (NativeAdView) inflater
.inflate(R.layout.ad_layout_file, parent);
// Locate the view that will hold the headline, set its text, and call the
// NativeAdView's setHeadlineView method to register it.
TextView headlineView = adView.findViewById<TextView>(R.id.ad_headline);
headlineView.setText(ad.getHeadline());
adView.setHeadlineView(headlineView);
// Repeat the process for the other assets in the NativeAd
// using additional view objects (Buttons, ImageViews, etc).
// If the app is using a MediaView, it should be
// instantiated and passed to setMediaView. This view is a little different
// in that the asset is populated automatically, so there's one less step.
MediaView mediaView = (MediaView) adView.findViewById(R.id.ad_media);
adView.setMediaView(mediaView);
// Call the NativeAdView's setNativeAd method to register the
// NativeAdObject.
adView.setNativeAd(ad);
// Ensure that the parent view doesn't already contain an ad view.
parent.removeAllViews();
// Place the AdView into the parent.
parent.addView(adView);
}
Kotlin
fun displayNativeAd(parent: ViewGroup, ad: NativeAd) {
// Inflate a layout and add it to the parent ViewGroup.
val inflater = parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)
as LayoutInflater
val adView = inflater.inflate(R.layout.ad_layout_file, parent) as NativeAdView
// Locate the view that will hold the headline, set its text, and use the
// NativeAdView's headlineView property to register it.
val headlineView = adView.findViewById<TextView>(R.id.ad_headline)
headlineView.text = ad.headline
adView.headlineView = headlineView
// Repeat the process for the other assets in the NativeAd using
// additional view objects (Buttons, ImageViews, etc).
val mediaView = adView.findViewById<MediaView>(R.id.ad_media)
adView.mediaView = mediaView
// Call the NativeAdView's setNativeAd method to register the
// NativeAdObject.
adView.setNativeAd(ad)
// Ensure that the parent view doesn't already contain an ad view.
parent.removeAllViews()
// Place the AdView into the parent.
parent.addView(adView)
}
Here are the individual tasks:
Inflate the layout
Java
LayoutInflater inflater = (LayoutInflater) parent.getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); NativeAdView adView = (NativeAdView) inflater .inflate(R.layout.ad_layout_file, parent);
Kotlin
val inflater = parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val adView = inflater.inflate(R.layout.ad_layout_file, parent) as NativeAdView
This code is inflating an XML layout that contains views for displaying a native ad and then locating a reference to the
NativeAdView
. Note that you could also reuse an existingNativeAdView
if there's one in your fragment or activity, or even create an instance dynamically without using a layout file.Populate and register the asset views
This sample code locates the view used to display the headline, sets its text using the string asset provided by the ad object, and registers it with the
NativeAdView
object:Java
TextView headlineView = adView.findViewById<TextView>(R.id.ad_headline); headlineView.setText(ad.getHeadline()); adView.setHeadlineView(headlineView);
Kotlin
val headlineView = adView.findViewById<TextView>(R.id.ad_headline) headlineView.text = ad.headline adView.headlineView = headlineView
This process of locating the view, setting its value, and registering it with the ad view class should be repeated for each of the assets provided by the native ad object that the app will display.
Handle clicks
Don't implement any custom click handlers on any views over or within the native ad view. Clicks on the ad view assets are handled by the SDK as long as you correctly populate and register the asset views, as discussed in the previous section.
To listen for clicks, implement the Google Mobile Ads SDK click callback:
Java
AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110") // ... .withAdListener(new AdListener() { @Override public void onAdFailedToLoad(LoadAdError adError) { // Handle the failure by logging. } @Override public void onAdClicked() { // Log the click event or other custom behavior. } }) .build();
Kotlin
val adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110") // ... .withAdListener(object : AdListener() { override fun onAdFailedToLoad(adError: LoadAdError) { // Handle the failure. } override fun onAdClicked() { // Log the click event or other custom behavior. } }) .build()
Register the MediaView
You're required to use the
MediaView
asset instead of theImageView
asset if you want to include a main image asset in the layout for your native ad.The
MediaView
is a specialView
designed to display the main media asset, either video or image.MediaView
can be defined in an XML layout or constructed dynamically. It should be placed within the view hierarchy of aNativeAdView
, just like any other asset view. Apps using aMediaView
must register it with theNativeAdView
:Java
// Populate and register the media asset view. nativeAdView.setMediaView(nativeAdBinding.adMedia);
Kotlin
// Populate and register the media asset view. nativeAdView.mediaView = nativeAdBinding.adMedia
ImageScaleType
The
MediaView
class has anImageScaleType
property when displaying images. If you want to change how an image is scaled in theMediaView
, set the correspondingImageView.ScaleType
using thesetImageScaleType()
method of theMediaView
:Java
mediaView.setImageScaleType(ImageView.ScaleType.CENTER_CROP);
Kotlin
mediaView.imageScaleType = ImageView.ScaleType.CENTER_CROP
MediaContent
The
MediaContent
class holds the data related to the media content of the native ad, which is displayed using theMediaView
class. When theMediaView
mediaContent
property is set with aMediaContent
instance:If a video asset is available, it's buffered and starts playing inside the
MediaView
. You can tell if a video asset is available by checkinghasVideoContent()
.If the ad does not contain a video asset, the
mainImage
asset is downloaded and placed inside theMediaView
instead.
By default,
mainImage
is the first downloaded image asset. IfsetReturnUrlsForImageAssets(true)
is used,mainImage
isnull
and you must set themainImage
property to your manually downloaded image. Note that this image will be used only when there is no video asset available.Register the native ad object
This final step registers the native ad object with the view responsible for displaying it.
Java
adView.setNativeAd(ad);
Kotlin
adView.setNativeAd(ad)
Destroy ad
When you are done showing your native ad, you should destroy it so that the ad is properly garbage collected.
Java
nativeAd.destroy();
Kotlin
nativeAd.destroy()
Examples on GitHub
Complete implementation of native ads example:
Next steps
Explore the following topics: