...
BuzzAd Andorid SDK의 개인 정보 수집 동의 UI를 사용하지 않거나, 다시 표시하고 싶은 경우 아래 표를 참고하여 설정할 수 있습니다.
Class | API | 설명 |
---|---|---|
BuzzAdBenefit | getPrivacyPolicyManager() |
PrivacyPolicyManager 인스턴스를 반환합니다. | |
PrivacyPolicyManager | showConsentUI(context, new PrivacyPolicyEventListener()) |
개인 정보 수집 동의 UI를 표시합니다. | |
grantConsent() |
개인 정보 수집 동의합니다. | |
revokeConsent() |
개인 정보 수집 동의를 철회합니다. | |
isConsentGranted() |
개인 정보 수집 동의 여부를 확인합니다. | ||
PrivacyPolicyEventListener | onUpdated(accepted: Boolean) |
|
프래그먼트로 Feed 연동
...
Feed 지면은 기본적으로 제공되는 액티비티로 제공됩니다. 더 다양한 연동 방식을 지원하기 위해 액티비티가 아닌 프래그먼트로 Feed 지면을 연동할 수 있습니다. 프래그먼트를 추가하고자 하는 액티비티에 프래그먼트를 추가하고, 해당 액티비티의 onCreate에서 프래그먼트를 초기화합니다.
...
Code Block | ||
---|---|---|
| ||
<!-- your_activity_layout.xml --> ...생략... <!-- FeedFragment 추가 --> <fragment android:id="@+id/feed_fragment" android:name="com.buzzvil.buzzad.benefit.presentation.feed.FeedFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> ...생략... class YourActivity extends Actvity { private FeedHandler feedHandler; @Override public void onCreate() { super.onCreate(); ...생략... // 광고를 새로 받기 위해 필요한 부분입니다. feedHandler = new FeedHandler(context, "YOUR_FEED_UNIT_ID"); // FeedFragment 초기화 final FeedFragment feedFragment = (FeedFragment) getSupportFragmentManager().findFragmentById(R.id.feed_fragment); if (feedFragment != null) { feedFragment.init(context, "YOUR_FEED_UNIT_ID"); } } ...생략... } |
FeedFragment의 UI도 Feed 디자인 커스터마이징을 참고하여 변경할 수 있습니다. (단, FeedFragment는 툴바 영역이 없습니다.)
...
Feed 무한 스크롤 기능이 활성화되어 있으면 사용자에게 마지막 광고가 보였을 때 광고를 추가로 할당받습니다. 추가 요청에서 광고가 할당되지 않으면 더 이상 요청하지 않습니다. FeedConfig를 FeedConfig
를 설정하여 무한 스크롤 기능을 비활성화할 사용하지 않을 수 있습니다. 기본적으로 Feed 무한 스크롤 기능은 활성화됩니다.
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") .autoLoadingEnabled(false) // Feed 무한 스크롤 기능 비활성화 .build(); |
툴바 영역 자체 구현
Feed 툴바 영역의 디자인을 변경할 수 있습니다. 툴바 영역을 UI를 변경하는 방법은 2가지입니다. 아래 2가지 방법 중 하나를 선택하여 연동합니다.
...
BuzzAd Android SDK에서 제공하는 기본 UI를 수정하여 타이틀 혹은 배경색을 변경할 수 있습니다. 다음은 BuzzAd Android SDK의 기본 UI를 수정하여 툴바를 변경하는 예시입니다.
DefaultFeedToolbarHolder
의 상 클래스를 구현하고, 기본으로 제공되는 기본 UI(FeedToolbar
)를 사용하여 타이틀 혹은 배경색을 변경합니다. 그리고 FeedConfig
에 구현한 클래스를 추가합니다.
Code Block | ||
---|---|---|
| ||
public class YourFeedToolbarHolder extends DefaultFeedToolbarHolder { @Override public View getView(Activity activity, @NonNull final String unitId) { toolbar = new FeedToolbar(activity); // PopToolbar 에서 제공하는 기본 Template 사용 toolbar.setTitle("YourFeedToolbarHolder"); toolbar.setIconResource(R.drawable.your_icon); toolbar.setBackgroundColor(YourColor(Color.parseColor("#123456")); addInquiryMenuItemView(activity); // 문의하기 버튼은 이 함수를 통해 간단하게 추가 가능합니다. addSettingsMenuItemView(activity); // 세팅 버튼은 이 함수를 통해 간단하게 추가 가능합니다. addRightMenuItemView1(activity); // custom 버튼 추가 return toolbar; } // custom 버튼 추가는 DefaultMenuLayout 를 사용하여 View 를 생성하고 // toolbar.addRightMenuButton 를 사용하여 toolbar 에 추가합니다. private void addRightMenuItemView1(@NonNull final Activity activity) { MenuLayout menuLayout = new DefaultMenuLayout(activity, R.mipmap.ic_launcher); menuLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showInquiry(); // showInquiry 를 호출하여 문의하기 페이지로 연결합니다. } }); toolbar.addRightMenuButton(menuLayout); } } |
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") .feedToolbarHolderClass(YourFeedToolbarHolder.class) .build(); |
...
Code Block | ||
---|---|---|
| ||
// AndroidManifest.xml ... <activity android:name="com.buzzvil.buzzad.benefit.presentation.feed.FeedBottomSheetActivity" android:theme="@style/YourActivityThemeCustomActivityTheme" tools:replace="android:theme"/> ... |
...
헤더 영역에 BuzzAd Android SDK 에서 기본으로 제공하는 UI를 사용해 “총 적립 가능 금액“을 사용자에게 보여줍니다. UI를 변경하기 위해서는 헤더 영역을 자체 구현해야 합니다. 헤더 영역을 자체 구현하는 방법은 아래 헤더 영역 자체 구현을 참고하시기 바랍니다.
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") .feedHeaderViewAdapterClass(DefaultFeedHeaderViewAdapter.class) .build(); |
...
Code Block | ||
---|---|---|
| ||
public class CustomFeedHeaderViewAdapter implements FeedHeaderViewAdapter { @Override public View onCreateView(final Context context, final ViewGroup parent) { final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); return inflater.inflate(R.layout.your_feed_header_layout, parent, false); } @Override public void onBindView(final View view, final int reward) { // Display total reward on the header if needed. finalval ViewtextView: rewardLayoutTextView = view.findViewById(R.id.rewardLayoutyour_textview); if (reward == 0) {textView.text = String.format("리워드 %d원", reward) } rewardLayout.setVisibility(View.GONE); @Override public } elsevoid onDestroyView() { // Use this rewardLayout.setVisibility(View.VISIBLE); this callback for clearing memory final TextView rewardTextView = view.findViewById(R.id.rewardText);} } |
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") .feedHeaderViewAdapterClass(CustomFeedHeaderViewAdapter.class) final String rewardText = view.getContextbuild().getString(R.string.bz_feed_header_view_reward_text, reward); rewardTextView.setText(rewardText); } } @Override public void onDestroyView() { // Use this this callback for clearing memory } }; |
광고 분류 기능
Feed지면에서는 사용자가 광고를 선택적으로 참여할 수 있도록 탭과 필터 기능을 지원합니다.
Table of Contents | ||||||
---|---|---|---|---|---|---|
|
탭 기능
...
사용자가 광고를 분류하여 볼 수 있도록 탭과 필터 기능이 기본으로 제공됩니다. 탭은 일반 광고(노출형 및 참여형)와 쇼핑 적립형 광고를 구분하는 역할을 합니다. 기본값은 True입니다.
다음은 FeedConfig
를 수정하여 탭을 비활성화하는 예시입니다.
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID")
.tabUiEnabled(false) // 탭 비활성화
.build(); |
탭의 디자인을 변경하기 위해서는 탭 UI 변경을 참고하시기 바랍니다
필터 기능
...
필터는 광고를 카테고리 별로 보다 세분화합니다. 필터는 탭에 종속되어 있습니다. 따라서, 탭이 비활성화되면 필터도 비활성화됩니다.
다음은 FeedConfig
를 수정하여 필터를 비활성화하는 예시입니다.
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") .tabUiEnabled(true) // .feedHeaderViewAdapterClass(CustomFeedHeaderViewAdapter.class) 탭이 비활성화되면 필터도 비활성화 됩니다. .filterUiEnabled(false) // 필터 비활성화 .build(); |
광고 분류 기능
Feed지면에서는 사용자가 광고를 선택적으로 참여할 수 있도록 탭과 필터 기능을 지원합니다필터의 디자인을 변경하기 위해서는 필터 UI 변경을 참고하시기 바랍니다.
광고 UI 자체 구현
BuzzAd Android SDK에서 제공하는 광고는 일반 광고와 쇼핑 적립 광고가 있습니다. 각각의 광고에 따라 UI를 변경하는 방법이 상이합니다. 일반 광고과 쇼핑 적립 광고의 UI를 모두 변경하기 위해서는 아래 2가지 가이드를 모두 적용해야합니다.
Table of Contents | ||||||
---|---|---|---|---|---|---|
|
탭 기능
...
사용자가 광고를 분류하여 볼 수 있도록 탭과 필터 기능이 기본으로 제공됩니다. 탭은 일반 광고(노출형 및 참여형)와 쇼핑 적립형 광고를 구분하는 역할을 합니다. 기본값은 True입니다.
다음은 FeedConfig
를 수정하여 탭을 비활성화하는 예시입니다.
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID")
.tabUiEnabled(false) // 탭 비활성화
.build(); |
탭의 디자인을 변경하기 위해서는 탭 UI 변경을 참고하시기 바랍니다
필터 기능
...
필터는 광고를 카테고리 별로 보다 세분화합니다. 필터는 탭에 종속되어 있습니다. 그래서, 탭이 비활성화되면 필터도 비활성화됩니다.
다음은 FeedConfig
를 수정하여 필터를 비활성화하는 예시입니다.
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID")
.tabUiEnabled(true) // 탭이 비활성화되면 필터도 비활성화 됩니다.
.filterUiEnabled(false) // 필터 비활성화
.build(); |
필터의 디자인을 변경하기 위해서는 필터 UI 변경을 참고하시기 바랍니다.
광고 UI 자체 구현
BuzzAd Android SDK에서 제공하는 광고는 일반 광고와 쇼핑 적립 광고가 있습니다. 각각의 광고에 따라 UI를 변경하는 방법이 상이합니다. 일반 광고과 쇼핑 적립 광고의 UI를 모두 변경하기 위해서는 아래 2가지 가이드를 모두 적용해야합니다.
Table of Contents | ||||||
---|---|---|---|---|---|---|
|
일반 광고 UI 자체 구현
...
다음은 일반 광고의 디자인을 변경하는 방법을 설명하는 예시입니다.
일반 광고용 NativeAdView의 규격에 맞는 레이아웃(your_feed_ad.xml
)을 구현합니다.
...
|
일반 광고 UI 자체 구현
...
다음은 일반 광고의 디자인을 변경하는 방법을 설명하는 예시입니다.
설명 | 비고 | |||||||
---|---|---|---|---|---|---|---|---|
| 광고의 제목 |
| ||||||
| 이미지, 동영상 등 광고 소재 |
| ||||||
| 광고에 대한 상세 설명 |
| ||||||
| 광고주 아이콘 이미지 |
| ||||||
| 광고의 참여를 유도하는 버튼 |
| ||||||
| Sponsored view |
|
일반 광고용 NativeAdView의 규격에 맞는 레이아웃(your_feed_ad.xml
)을 구현합니다.
Code Block |
---|
// your_feed_ad.xml
<com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView
android:id="@+id/native_ad_view" ...>
// MediaView와 CtaView는 NativeAdView의 하위 컴포넌트로 구현해야합니다.
<LinearLayout ... >
<com.buzzvil.buzzad.benefit.presentation.media.MediaView
android:id="@+id/mediaView" ... />
<TextView
android:id="@+id/textTitle" ... />
<TextView
android:id="@+id/textDescription" ... />
<ImageView
android:id="@+id/imageIcon" ... />
<com.buzzvil.buzzad.benefit.presentation.media.CtaView
android:id="@+id/ctaView" ... />
</LinearLayout>
</com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView> |
AdsAdapter의 상속 클래스를 구현합니다. 구현한 상속 클래스의 onCreateViewHolder에서 your_feed_ad.xml
을 사용하여 NativeAdView를 생성합니다. 그리고 FeedConfig에 구현한 YourAdsAdapter
를 설정합니다. CTA 버튼 커스터마이징은 CTA 변경을 참고하시기 바랍니다.
(아래 예시에서 아이콘을 그리기 위해 ImageLoader
라이브러리를 사용하였습니다.)
Code Block | ||
---|---|---|
| ||
public class YourAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> { @Override public NativeAdViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final NativeAdView feedNativeAdView = (NativeAdView) inflater.inflate(R.layout.your_feed_ad, parent, false); return new NativeAdViewHolder(feedNativeAdView); } @Override public void onBindViewHolder(NativeAdViewHolder holder, NativeAd nativeAd) { super.onBindViewHolder(holder, nativeAd); final NativeAdView view = (NativeAdView) holder.itemView; final Ad ad = nativeAd.getAd(); // create ad component final MediaView mediaView = view.findViewById(R.id.mediaView); final TextView titleView = view.findViewById(R.id.textTitle); final ImageView iconView = view.findViewById(R.id.imageIcon); final TextView descriptionView = view.findViewById(R.id.textDescription); final CtaView ctaView = view.findViewById(R.id.ctaView); final CtaPresenter ctaPresenter = new CtaPresenter(ctaView); // CtaView should not be null // data binding ctaPresenter.bind(nativeAd); if (mediaView != null) { <commediaView.buzzvil.buzzad.benefit.presentation.media.MediaViewsetCreative(ad.getCreative()); android:id="@+id/mediaView" ... />mediaView.setVideoEventListener(new VideoEventListener() { <TextView // Override and implement methods android:id="@+id/textTitle" ... /> <TextView }); android:id="@+id/textDescription" ... /> } <ImageView if (titleView android:id="@+id/imageIcon" ... />!= null) { <comtitleView.buzzvil.buzzad.benefit.presentation.media.CtaView setText(ad.getTitle()); } android:id="@+id/ctaView" ... />if (iconView != null) { </LinearLayout> </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView> |
AdsAdapter의 상속 클래스를 구현합니다. 구현한 상속 클래스의 onCreateViewHolder에서 your_feed_ad.xml
을 사용하여 NativeAdView를 생성합니다. 그리고 FeedConfig에 구현한 YourAdsAdapter
를 설정합니다. CTA 버튼 커스터마이징은 CTA 변경을 참고하시기 바랍니다.
(아래 예시에서 아이콘을 그리기 위해 ImageLoader
라이브러리를 사용하였습니다.)
Code Block | ||
---|---|---|
| ||
public class YourAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> { @OverrideImageLoader.getInstance().displayImage(ad.getIconUrl(), iconView); } public NativeAdViewHolderif onCreateViewHolder(ViewGroupdescriptionView parent, int viewType!= null) { final LayoutInflater inflater = LayoutInflaterdescriptionView.fromsetText(parentad.getContextgetDescription()); final NativeAdView feedNativeAdView = (NativeAdView) inflater.inflate(R.layout.your_feed_ad, parent, false);} // clickableViews에 return추가된 new NativeAdViewHolder(feedNativeAdView); }UI 컴포넌트를 클릭하면 광고 페이지로 이동합니다. @Override final Collection<View> clickableViews public= voidnew onBindViewHolderArrayList<>(NativeAdViewHolder); holder, NativeAd nativeAd) { clickableViews.add(ctaView); final NativeAdView view = clickableViews.add(NativeAdViewmediaView) holder.itemView;; clickableViews.add(titleView); final Ad ad = nativeAdclickableViews.getAdadd(descriptionView); // create광고 콜백 ad이벤트를 component수신할 수 있습니다. final MediaView mediaView =// view.findViewById(R.id.mediaView); setNativeAd 보다 전에 호출해야 합니다. final TextView titleView = view.findViewByIdaddOnNativeAdEventListener(R.id.textTitle);new NativeAdView.OnNativeAdEventListener() { final ImageView iconView = view.findViewById(R.id.imageIcon); final TextView descriptionView = view.findViewById(R.id.textDescription); @Override final CtaView ctaView = view.findViewById(R.id.ctaView); final CtaPresenter ctaPresenter = new CtaPresenter(ctaView); // CtaView should not be null public void onImpressed(final @NonNull NativeAdView view, final @NonNull NativeAd nativeAd) { } // data binding @Override ctaPresenter.bind(nativeAd); public ifvoid (mediaView != nullonClicked(@NonNull NativeAdView view, @NonNull NativeAd nativeAd) { mediaView.setCreative(ad.getCreative()); ctaPresenter.bind(nativeAd); } mediaView.setVideoEventListener(new VideoEventListener() { @Override // Override and implement methodspublic void onRewardRequested(@NonNull NativeAdView view, @NonNull NativeAd nativeAd) { @Override } public void@Override onVideoStarted() {} public void onRewarded(@NonNull NativeAdView nativeAdView, @NonNull ...생략... NativeAd nativeAd, @Nullable RewardResult rewardResult) { } }); @Override } public void onParticipated(final @NonNull NativeAdView view, iffinal (titleView@NonNull !=NativeAd nullnativeAd) { titleView.setText(ad.getTitle());ctaPresenter.bind(nativeAd); } }); if (iconView != null) { ImageLoaderview.getInstance().displayImage(ad.getIconUrl(), iconViewsetMediaView(mediaView); }view.setClickableViews(clickableViews); if (descriptionView != null) {view.setNativeAd(nativeAd); } } |
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new descriptionView.setText(ad.getDescription());FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") .adsAdapterClass(YourAdsAdapter.class) } // clickableViews에 추가된 UI 컴포넌트를 클릭하면 광고 페이지로 이동합니다. final Collection<View> clickableViews = new ArrayList<>(); clickableViews.add(ctaView);.build(); |
쇼핑 적립 광고 UI 자체 구현
다음은 쇼핑 적립 광고의 디자인을 변경하는 방법을 설명합니다. 쇼핑 적립 광고는 일반 광고에 비해 많은 정보를 제공합니다.
Info |
---|
일반 광고의 커스터마이징도 참고하시기 바랍니다. |
...
쇼핑 적립 광고용 NativeAdView의 규격에 맞는 레이아웃(your_feed_ad_cps.xml
)을 구현합니다. 일반 광고용 레이아웃에 없는 priceText
, originalPriceText
, discountPercentageText
, categoryText
가 있습니다.
Code Block |
---|
// your_feed_ad_cps.xml <?xml version="1.0" encoding="utf-8"?> <com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView android:id="@+id/native_ad_view" ...생략... > <LinearLayout ...생략... > clickableViews.add(mediaView); clickableViews.add(titleView); // clickableViews.add(descriptionView); MediaView와 CtaView는 NativeAdView의 하위 컴포넌트로 구현해야합니다. // 광고 콜백 이벤트를 수신할 수 있습니다. <com.buzzvil.buzzad.benefit.presentation.media.MediaView // view.setNativeAd 보다 전에 호출해야 합니다. android:id="@+id/mediaView" view.addOnNativeAdEventListener(new NativeAdView.OnNativeAdEventListener() { ...생략... /> @Override...생략... public void<TextView onImpressed(final @NonNull NativeAdView view, final @NonNull NativeAd nativeAd) { android:id="@+id/priceText" } ...생략... /> <TextView @Override public void onClicked(@NonNull NativeAdView view, @NonNull NativeAd nativeAd) {android:id="@+id/originalPriceText" ...생략... /> ctaPresenter.bind(nativeAd); <TextView } android:id="@+id/discountPercentageText" @Override ...생략... /> <TextView public void onRewardRequested(@NonNull NativeAdView view, @NonNull NativeAd nativeAd) { android:id="@+id/categoryText" } ...생략... /> @Override ...생략... public void onRewarded(@NonNull NativeAdView nativeAdView, @NonNull NativeAd nativeAd, @Nullable RewardResult rewardResult) { </LinearLayout> }...생략... </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView> |
AdsAdapter의 상속 클래스를 구현합니다. 구현한 상속 클래스의 onCreateViewHolder에서 your_feed_ad_cps.xml
을 사용하여 NativeAdView를 생성합니다. 그리고 FeedConfig에 구현한 YourCPSAdsAdapter
를 설정합니다.
CTA 버튼 커스터마이징은 CTA 변경을 참고하시기 바랍니다.
Code Block | ||
---|---|---|
| ||
public class YourCPSAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> { @Override public NativeAdViewHolder onCreateViewHolder(ViewGroup parent, @Overrideint viewType) { final LayoutInflater publicinflater void onParticipated(final @NonNull NativeAdView view, final @NonNull NativeAd nativeAd) { ctaPresenter.bind(nativeAd);= LayoutInflater.from(parent.getContext()); final NativeAdView feedNativeAdView = (NativeAdView) inflater.inflate(R.layout.your_feed_ad_cps, parent, false); return new NativeAdViewHolder(feedNativeAdView); } @Override }); public void onBindViewHolder(NativeAdViewHolder holder, NativeAd nativeAd) { viewsuper.setMediaView(mediaViewonBindViewHolder(holder, nativeAd); view.setClickableViews(clickableViews); view.setNativeAd(nativeAd); } } | ||
Code Block | ||
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") .adsAdapterClass(YourAdsAdapter.class)final NativeAdView view = (NativeAdView) holder.itemView; final Ad ad = nativeAd.getAd(); .build(); |
쇼핑 적립 광고 UI 자체 구현
다음은 쇼핑 적립 광고의 디자인을 변경하는 방법을 설명합니다. 쇼핑 적립 광고는 일반 광고에 비해 많은 정보를 제공합니다.
Info |
---|
일반 광고의 커스터마이징도 참고하시기 바랍니다. |
...
쇼핑 적립 광고용 NativeAdView의 규격에 맞는 레이아웃(your_feed_ad_cps.xml
)을 구현합니다. 일반 광고용 레이아웃에 없는 priceText
, originalPriceText
, discountPercentageText
, categoryText
가 있습니다.
Code Block |
---|
// your_feed_ad_cps.xml <?xml version="1.0" encoding="utf-8"?> <com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView android:id="@+id/native_ad_view"// create ad component // ...생략... > <LinearLayout final TextView priceText = view.findViewById(R..생략... > id.discountedPriceText); final TextView originalPriceText = view.findViewById(R.id.originalPriceText); // MediaView와 CtaView는 NativeAdView의 하위 컴포넌트로 구현해야합니다. final TextView discountPercentageText = view.findViewById(R.id.discountPercentageText); final TextView categoryText = <comview.buzzvilfindViewById(R.buzzad.benefit.presentation.media.MediaViewid.categoryText); android:id="@+id/mediaView" // data binding // ...생략... /> final Product product = ad.getProduct(); ...생략... if (product != null) { <TextView if (product.getDiscountedPrice() != null) { android:id="@+id/priceText" ...생략... //> 할인이 있는 쇼핑 광고 <TextView android:id="@+id/originalPriceText"originalPriceText.setPaintFlags(originalPriceText.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); ...생략... /> int percentage = 0; <TextView android:id="@+id/discountPercentageText" if (product.getPrice() > product.getDiscountedPrice()) { ...생략... /> <TextView percentage = Math.round(((product.getPrice() - product.getDiscountedPrice()) / product.getPrice() * 100)); android:id="@+id/categoryText" ...생략... />} if (percentage > 0) { ...생략... </LinearLayout> priceText.setText(getCommaSeparatedPrice(product..생략... </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView> |
AdsAdapter의 상속 클래스를 구현합니다. 구현한 상속 클래스의 onCreateViewHolder에서 your_feed_ad_cps.xml
을 사용하여 NativeAdView를 생성합니다. 그리고 FeedConfig에 구현한 YourCPSAdsAdapter
를 설정합니다.
CTA 버튼 커스터마이징은 CTA 변경을 참고하시기 바랍니다.
Code Block | ||
---|---|---|
| ||
public class YourCPSAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> {getDiscountedPrice().longValue())); originalPriceText.setText(getCommaSeparatedPrice((long) product.getPrice())); @Override public NativeAdViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { discountPercentageText.setText(String.format(Locale.ROOT, "%d%%", percentage)); final LayoutInflater inflater = LayoutInflaterdiscountPercentageText.fromsetVisibility(parentView.getContext()VISIBLE); final NativeAdView feedNativeAdView = (NativeAdView) inflater.inflate(R.layout.your_feed_ad_cps, parent, false); } else { return new NativeAdViewHolder(feedNativeAdView); } @Override public void onBindViewHolder(NativeAdViewHolder holder, NativeAd nativeAd) {priceText.setText(getCommaSeparatedPrice((long) product.getPrice())); final NativeAdView view = (NativeAdView) holder.itemView; originalPriceText.setText(""); final Ad ad = nativeAd.getAd(); discountPercentageText.setVisibility(View.GONE); // create ad component ...생략... } final TextView priceText = view.findViewById(R.id.discountedPriceText); } else { final TextView originalPriceText = view.findViewById(R.id.originalPriceText); // 할인이 없는 쇼핑 final광고 TextView discountPercentageText = view.findViewById(R.id.discountPercentageText); final TextView categoryText = view.findViewById(R.id.categoryTextpriceText.setText(getCommaSeparatedPrice((long) product.getPrice())); // data binding originalPriceText.setText(""); ...생략... final Product product = addiscountPercentageText.getProductsetVisibility(View.GONE); if (product != null) { } if categoryText.setText(product.getDiscountedPricegetCategory() != null); { if (!TextUtils.isEmpty(product.getCategory())) { // 할인이 있는 쇼핑 광고 originalPriceText.setPaintFlags(originalPriceText.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)categoryText.setVisibility(View.VISIBLE); } int percentage = 0; } final Collection<View> clickableViews = if (product.getPrice() > product.getDiscountedPrice()) {new ArrayList<>(); clickableViews.add(ctaView); clickableViews.add(mediaView); percentage = Math.round(((product.getPrice() - product.getDiscountedPrice()) / productclickableViews.getPriceadd(descriptionView); * 100)); }// ...생략... if (percentage > 0) {view.setMediaView(mediaView); view.setClickableViews(clickableViews); priceText.setText(getCommaSeparatedPrice(product.getDiscountedPrice().longValue()))view.setNativeAd(nativeAd); } private String getCommaSeparatedPrice (long price){ originalPriceText.setText(getCommaSeparatedPrice((long) product.getPrice())) return String.format(Locale.getDefault(), "₩%,d", price); } } |
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") discountPercentageText.setTextcpsAdsAdapterClass(String.format(Locale.ROOT, "%d%%", percentage));YourCPSAdsAdapter.class) .build(); |
기본 포인트 지급 안내 UI 자체 구현
...
사용자가 Feed 지면에 접근하면 일정 주기로 기본 포인트를 지급합니다. 기본 포인트 지급 알림 UI는 위의 이미지와 같습니다. 기본 포인트 지급 알림 UI를 수정하여 좀 더 사용자 경험을 개선할 수 있습니다.
다음은 기본 포인트 지급 알림 UI 를 수정하는 예시입니다.
Code Block | ||
---|---|---|
| ||
public class YourFeedFeedbackHandler extends DefaultFeedFeedbackHandler { @Override discountPercentageText.setVisibility(View.VISIBLE);@NotNull public View getBaseRewardNotificationView(@NotNull Context context, int reward) { } else {View view = LayoutInflater.from(context).inflate(R.layout.your_layout, null); return view priceText.setText(getCommaSeparatedPrice((long) product.getPrice())); } } |
Code Block | ||
---|---|---|
| ||
final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") .feedFeedbackHandler(YourFeedFeedbackHandler.class) originalPriceText.setText(""); discountPercentageText.setVisibility(View.GONE); } } else {.build(); |
광고 미할당 안내 디자인 자체 구현하기
Feed 지면에 진입한 시점에 노출할 광고가 없다면 광고 미할당 안내 UI가 표시됩니다. 미할당 안내 디자인은 자체 구현하여 변경할 수 있습니다.
...
광고 미할당 안내 디자인을 직접 구현하려면 다음의 절차를 따르세요.
Feed 지면에 광고가 할당되지 않았을 때의 화면에 추가할 에러 이미지(
feedErrorImageView
), 타이틀(feedErrorTitle
), 상세 설명(feedErrorDescription
) 레이아웃을 작성하세요.Code Block <!-- custom_feed_error_view.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="vertical" android:padding="40dp"> <ImageView
...
android:id="@+id/feedErrorImageView" android:layout_width="match_parent"
...
android:layout_height="wrap_content"/> <TextView
...
android:id="@+id/feedErrorTitle" android:layout_width="wrap_content"
...
android:layout_height="wrap_content" android:layout_gravity="center_horizontal"
...
android:layout_marginTop="32dp"
...
android:textColor="@color/bz_text_emphasis" android:textSize="16sp" />
...
...
...
<TextView android:id="@+id/feedErrorDescription"
...
android:layout_width="wrap_content" android:layout_height="wrap_content"
...
...
android:layout_gravity="center_horizontal"
...
...
...
android:layout_marginTop="8dp"
...
...
android:textAlignment="center"
...
android:textColor="@color/bz_text_description"
...
android:textSize="14sp"
...
/> </LinearLayout>
FeedErrorViewHolder
를 구현하는 커스텀 클래스CustomErrorView
를 새로 생성하고, 자동 완성되는GetView()
메소드를 다음과 같이 구현하세요.Code Block public class CustomErrorView extends FeedErrorViewHolder { @NonNull @Override
...
public View getErrorView(@NonNull Activity activity) {
...
// TODO: 1번에서 생성한 custom_feed_error_view 레이아웃을 inflate
...
View errorView =
...
activity.
...
getLayoutInflater(
...
).inflate(R.layout.custom_feed_error_view, null, false);
...
...
...
...
final ImageView errorImageView = errorView.findViewById(R.id.feedErrorImageView);
...
...
language | java |
---|
final
...
TextView
...
errorTitle =
...
errorView.
...
findViewById(R.id.feedErrorTitle); final TextView errorDescription = errorView.
...
findViewById(
...
R.id.
...
feedErrorDescription); errorImageView.
...
기본 포인트 지급 안내 UI 자체 구현
...
사용자가 Feed 지면에 접근하면 일정 주기로 기본 포인트를 지급합니다. 기본 포인트 지급 알림 UI는 위의 이미지와 같습니다. 기본 포인트 지급 알림 UI를 수정하여 좀 더 사용자 경험을 개선할 수 있습니다.
다음은 기본 포인트 지급 알림 UI 를 수정하는 예시입니다.
...
language | kotlin |
---|
...
setImageResource(R.drawable.bz_ic_feed_profile_coin); // 에러 이미지 설정
...
errorTitle.setText("타이틀: 광고가 없습니다. "); // 에러 타이틀 텍스트 설정 errorDescription.setText("디스크립션: 할당된 광고가 없습니다!"); // 에러 상세 텍스트 설정 return
...
errorView; } }
...
language | kotlin |
---|
FeedConfig
의feedErrorViewHolderClass
속성에 이전 단계에서 생성한CustomErrorView
클래스를 추가하세요.Code Block // Feed 지면 초기화 // TODO: feedErrorViewHolderClass 속성에 2번에서 생성한 CustomErrorView 클래스를 설정합니다. final FeedConfig feedConfig = new FeedConfig.Builder(
...
YOUR_FEED_UNIT_ID
...
)
...
.feedErrorViewHolderClass(CustomErrorView.class) .build();
액션형 광고의 브릿지 페이지에 배너 광고 지면 추가
...
AdfitNative ADN (연동 심사 불필요)
ADN 광고를 연동하기 위해서 ADN 연동을 참고하시기 바랍니다.