הצגת מודעה מותאמת
כשמודעה מותאמת נטענת, Google Mobile Ads SDK מפעיל את המאזינים לזיהוי פורמט המודעה המתאים. לאחר מכן האפליקציה אחראית להצגת המודעה, אבל היא לא חייבת לעשות זאת באופן מיידי. כדי להקל על הצגת פורמטים של מודעות שהוגדרו על ידי המערכת, תוכלו למצוא ב-SDK כמה משאבים שימושיים, כפי שמתואר בהמשך.
כיתה אחת (NativeAdView
)
לפורמט NativeAd
, יש את המחלקה NativeAdView
תואמת. המחלקה הזו היא ViewGroup
שבעלי האפליקציות צריכים להשתמש בה בתור הבסיס ל-NativeAd
. NativeAdView
יחיד מתייחס למודעה מותאמת אחת.
כל תצוגה שמשמשת להצגת הנכסים של אותה מודעה (למשל, ImageView
שמציג את נכס צילום המסך) צריכה להיות צאצא של האובייקט NativeAdView
.
היררכיית התצוגות של מודעה מותאמת שמשתמשת ב-LinearLayout
כדי להציג את תצוגות הנכסים שלה עשויה להיראות כך:
<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>
// Other assets such as image or media view, call to action, etc follow.
...
</LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
הנה דוגמה שיוצרת NativeAdView
ומאכלסת אותו ב-NativeAd
:
Java
AdLoader.Builder builder = new AdLoader.Builder(this, "AD_UNIT_ID")
.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 text, images and the native ad, etc into the ad
// view.
populateNativeAdView(nativeAd, adView);
frameLayout.removeAllViews();
frameLayout.addView(adView);
}
});
Kotlin
val builder = AdLoader.Builder(this, "AD_UNIT_ID")
.forNativeAd { nativeAd ->
// 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 text, images and the native ad, etc into the ad
// view.
populateNativeAdView(nativeAd, adView)
// Assumes you have a placeholder FrameLayout in your View layout
// (with id ad_frame) where the ad is to be placed.
ad_frame.removeAllViews()
ad_frame.addView(adView)
}
שימו לב שכל הנכסים במודעה מותאמת צריכים להיות מוצגים בתוך הפריסה NativeAdView
. Google Mobile Ads SDK מנסה לתעד אזהרה כשנכסים מותאמים עוברים רינדור מחוץ לפריסה של תצוגת מודעות מותאמות.
המחלקות של הצפיות במודעה מספקות גם שיטות לרישום התצוגה שמשמשת לכל נכס בנפרד, ואחת לרישום האובייקט NativeAd
עצמו.
רישום התצוגות בדרך הזו מאפשר ל-SDK לטפל באופן אוטומטי במשימות כמו:
- קליקים על תיעוד
- תיעוד החשיפות כשהפיקסל הראשון גלוי במסך
- הצגת שכבת-העל 'מודעות שנבחרו' לנכסי קריאייטיב מותאמים למילוי חוסרים (backfill) עם הגבלה כרגע לקבוצה נבחרת של בעלי תוכן דיגיטלי
שכבת-על של 'מודעות שנבחרו'
שכבת-על של 'מודעות שנבחרו' מתווספת על ידי ה-SDK כצפייה במודעה כשמוחזרת מודעת מילוי חוזר. אם באפליקציה נעשה שימוש במילוי חוזר של מודעות מותאמות, יש להשאיר מקום בפינה המועדפת בתצוגת המודעות המותאמות, עבור הלוגו של AdChoices שנוסף באופן אוטומטי. בנוסף, חשוב מאוד לראות בקלות את שכבת-העל של 'מודעות שנבחרו', לכן חשוב לבחור צבעי רקע ותמונות בהתאם. בהנחיות להטמעת מודעות מותאמות פרוגרמטיות תוכלו לקרוא מידע נוסף על המראה והתפקוד של שכבת-העל.
שיוך (Attribution) של מודעות מותאמות פרוגרמטיות
כשמציגים מודעות מותאמות פרוגרמטיות, יש להציג ייחוס של מודעה כדי לציין שהצפייה היא פרסומת. מידע נוסף זמין בהנחיות המדיניות.
קוד לדוגמה
כדי להציג מודעה מותאמת:
- יצירת מופע של המחלקה
NativeAdView
. - לגבי כל נכס שמצורף למודעה:
- מאכלסים את תצוגת הנכס עם הנכס באובייקט המודעה.
- רושמים את תצוגת הנכס במחלקה
ViewGroup
.
- רושמים את
MediaView
אם פריסת המודעות המותאמת כוללת נכס מדיה גדול. - רישום אובייקט המודעה במחלקה
ViewGroup
.
הנה פונקציה לדוגמה שמציגה 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 above 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 above 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)
}
אלה המשימות הנפרדות:
הגדלת הפריסה
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
הקוד הזה מנפח פריסת XML שכוללת צפיות להצגת מודעה מותאמת, ולאחר מכן מאתר הפניה אל
NativeAdView
. שימו לב שאפשר להשתמש שוב ב-NativeAdView
קיים אם יש רכיב במקטע או בפעילות, או אפילו ליצור מכונה באופן דינמי בלי להשתמש בקובץ פריסה.אכלוס ורישום של תצוגות הנכסים
הקוד לדוגמה מאתר את התצוגה שמשמשת להצגת הכותרת, מגדיר את הטקסט שלה באמצעות נכס המחרוזת שסופק על ידי אובייקט המודעה ורושם אותה עם האובייקט
NativeAdView
: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
צריך לחזור על התהליך הזה של איתור התצוגה, הגדרת הערך שלה ורישום שלה לסיווג של צפייה במודעה, בכל אחד מהנכסים שסופקו על ידי אובייקט המודעה המותאמת שהאפליקציה תציג.
קליקים על כינוי
אל תטמיעו רכיבי handler של קליקים בהתאמה אישית בתצוגות מעל או בתוכו של המודעה המותאמת. כדי לצפות באירועי קליקים בעצמכם, השתמשו בכלי להאזנה למודעות.
ה-SDK מטפל בקליקים על נכסים של צפיות במודעה, כל עוד מאוכלסים ורושמים את הצפיות בנכסים כמו שצריך, כפי שמתואר בקטע הקודם.
הנה דוגמה שמשתמשת בכלי להאזנה למודעות כדי לצפות באירועי קליקים:
Java
AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native") ... .withAdListener(new AdListener() { @Override public void onAdFailedToLoad(LoadAdError adError) { // Handle the failure by logging, altering the UI, and so on. } @Override public void onAdClicked() { // Log the click event or other custom behavior. } }) .build();
Kotlin
val adLoader = AdLoader.Builder(this, "/6499/example/native") ... .withAdListener(object : AdListener() { override fun onAdFailedToLoad(adError: LoadAdError) { // Handle the failure by logging, altering the UI, and so on. } }) .build()
רישום ה-MediaView
אם רוצים לכלול נכס תמונה ראשי בפריסה של המודעה המותאמת צריך להשתמש בנכס
MediaView
במקום בנכסImageView
.MediaView
הואView
מיוחד שמיועד להציג את נכס המדיה הראשי, וידאו או תמונה.אפשר להגדיר את
MediaView
בפריסת XML או לבנות באופן דינמי. צריך למקם אותו בהיררכיית התצוגה שלNativeAdView
, בדיוק כמו בכל תצוגת נכס אחרת. אפליקציות שמשתמשות ב-MediaView
חייבות לרשום אותו ב-NativeAdView
:Java
MediaView mediaView = adView.findViewById(R.id.ad_media); adView.setMediaView(mediaView);
Kotlin
adView.mediaView = adView.findViewById<MediaView>(R.id.ad_media)
בדומה לכל הצפיות בנכסים, עליכם לאכלס את התוכן בתצוגת המדיה. הפעולה הזו מתבצעת באמצעות השיטה
getMediaContent()
כדי לאחזר תוכן מדיה שניתן להעביר ל-MediaView
. הנה קטע קוד המגדיר את תוכן המדיה עבור תצוגת המדיה:Java
mediaView.setMediaContent(nativeAd.getMediaContent());
Kotlin
mediaView.mediaContent = nativeAd.mediaContent
ImageScaleType
למחלקה
MediaView
יש מאפייןImageScaleType
בהצגת תמונות. אם רוצים לשנות את גודל התמונה ב-MediaView
, צריך להגדיר אתImageView.ScaleType
המתאים באמצעות השיטהsetImageScaleType()
שלMediaView
:Java
mediaView.setImageScaleType(ImageView.ScaleType.CENTER_CROP);
Kotlin
mediaView.imageScaleType = ImageView.ScaleType.CENTER_CROP
MediaContent
המחלקה
MediaContent
מכילה את הנתונים שקשורים לתוכן המדיה של המודעה המותאמת, שמוצג באמצעות המחלקהMediaView
. כשהנכסMediaView
mediaContent
מוגדר עם מופע שלMediaContent
:אם נכס וידאו זמין, הוא נשמר במאגר נתונים זמני ומתחיל לפעול בתוך
MediaView
. אפשר לדעת אם נכס וידאו זמין באמצעותhasVideoContent()
.אם אין במודעה נכס וידאו, המערכת תוריד את הנכס
mainImage
ותציב אותו בתוךMediaView
.
כברירת מחדל, נכס התמונות הראשון שהורד הוא
mainImage
. אם נעשה שימוש ב-setReturnUrlsForImageAssets(true)
, הערךmainImage
הואnull
וצריך להגדיר את המאפייןmainImage
כתמונה שהורדתם באופן ידני. שימו לב שייעשה שימוש בתמונה הזו רק כאשר אין נכס וידאו זמין.רישום אובייקט המודעה המותאמת
בשלב האחרון, נרשום את אובייקט המודעה המותאמת ואת התצוגה שאחראית להצגתו:
Java
adView.setNativeAd(ad);
Kotlin
adView.setNativeAd(ad)
השמדת מודעה
כשתסיימו להציג את המודעה המותאמת, עליכם להשמיד אותה כדי שהמודעה תאסוף כראוי את האשפה.
Java
nativeAd.destroy();
.inflate(R.layout.ad_layout_file, parent);
Kotlin
nativeAd.destroy()
בדיקה של קוד המודעות המותאמות
מודעות במכירה ישירה
כדי לבדוק איך הן מודעות מותאמות שנמכרות ישירות, תוכלו להשתמש במזהה הבא של יחידת המודעות ב-Ad Manager:
/6499/example/native
היא מוגדרת להציג מודעות לדוגמה להתקנת אפליקציה ולתוכן, וכן פורמט מותאם אישית של מודעות מותאמות עם הנכסים הבאים:
- כותרת (טקסט)
- KeywordImage (image)
- כיתוב (טקסט)
מזהה התבנית של מודעות מותאמות אישית בפורמט 10063170
.
מודעות מותאמות למילוי חוסרים (backfill)
המילוי החוזר של Ad Exchange מוגבל כרגע לקבוצה נבחרת של בעלי אפליקציות. כדי לבדוק את ההתנהגות של מודעות מותאמות למילוי חוזר, השתמשו ביחידת המודעות הבאה מ-Ad Manager:
/6499/example/native-backfill
היא מציגה דוגמאות של מודעות להתקנת אפליקציה ומודעות תוכן שכוללות את שכבת-העל 'מודעות שנבחרו'.
זכרו לעדכן את הקוד כך שיתייחס למזהי התבניות ויחידת המודעות בפועל לפני תחילת הפרסום.
דוגמאות ב-GitHub
דוגמה להטמעה מלאה של מודעות מותאמות:
השלבים הבאים
נסו את הנושאים הבאים: