Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. 쇼핑 적립 광고용 NativeAdView의 규격에 맞는 레이아웃(your_feed_ad_cps.xml)을 구현하세요.

    • 일반 광고용 레이아웃에서 priceText, originalPriceText, discountPercentageText를 추가해야 합니다.

      Code Block
      languagexml
      <!-- 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>
              <!-- MediaView와 DefaultCtaView는 NativeAdView의 하위 컴포넌트로 구현합니다. -->        
              <com.buzzvil.buzzad.benefit.presentation.media.MediaView
                  android:id="@+id/mediaView"
                  ...생략... />
              <TextView
                  android:id="@+id/priceText"
                  ...생략... />
              <TextView
                  android:id="@+id/originalPriceText"
                  ...생략... />
              <TextView
                  android:id="@+id/discountPercentageText"
                  ...생략... />
          </LinearLayout>
      </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView>

  2. 일반 광고 디자인 자체 구현하기 토픽을 참고해 AdsAdapter의 상속 클래스를 구현하세요.
    다음의 예시 코드를 참고하세요.

    Code Block
    languagejava
    public class CustomCPSAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> {
    
        @NonNull
        @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_cps, 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 TextView priceText = view.findViewById(R.id.discountedPriceText);
            final TextView originalPriceText = view.findViewById(R.id.originalPriceText);
            final TextView discountPercentageText = view.findViewById(R.id.discountPercentageText);
    
            // 광고 데이터(NativeAd)를 바인딩합니다. 
            ...생략...
            final Product product = nativeAd.getShoppingProduct();
            if (product != null) {
                if (product.getDiscountedPrice() != null) {
                    // 할인이 있는 쇼핑 광고
                    originalPriceText.setPaintFlags(originalPriceText.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
                    int percentage = 0;
                    if (product.getPrice() > product.getDiscountedPrice()) {
                        percentage = Math.round(((product.getPrice() - product.getDiscountedPrice()) / product.getPrice() * 100));
                    }
                    if (percentage > 0) {
                        priceText.setText(getCommaSeparatedPrice(product.getDiscountedPrice().longValue()));
                        originalPriceText.setText(getCommaSeparatedPrice((long) product.getPrice()));
                        discountPercentageText.setText(String.format(Locale.ROOT, "%d%%", percentage));
                        discountPercentageText.setVisibility(View.VISIBLE);
                    } else {
                        priceText.setText(getCommaSeparatedPrice((long) product.getPrice()));
                        originalPriceText.setText("");
                        discountPercentageText.setVisibility(View.GONE);
                    }
                } else {
                    // 할인이 없는 쇼핑 광고
                    priceText.setText(getCommaSeparatedPrice((long) product.getPrice()));
                    originalPriceText.setText("");
                    discountPercentageText.setVisibility(View.GONE);
                }
            }
            
            final NativeAdViewBinder viewBinder = new NativeAdViewBinder.Builder(view, mediaView)
                .descriptionTextView(descriptionView)
                .ctaView(ctaView)
                // 부가 기능: 텍스트를 클릭할 수 있도록 설정합니다.
                .addClickableView(discountPercentageText)
                .addClickableView(priceText)
                .addClickableView(originalPriceText)
                .build()
            viewBinder.bind(nativeAd)
            
            ...생략...
        }
    
        private String getCommaSeparatedPrice (long price){
            return String.format(Locale.getDefault(), "₩%,d", price);
        }
    }

  3. FeedConfig에 위에서 작성한 CustomCPSAdsAdapter를 쇼핑 적립형 광고 어댑터 클래스로 설정하세요.

    Code Block
    languagejava
    final FeedConfig feedConfig = new FeedConfig.Builder("YOUR_FEED_UNIT_ID")
            .cpsAdsAdapterClass(YourCPSAdsAdapter.class)
            .build();

CTA 버튼 자체 구현하기

BuzzAd Android용 SDK에서 기본으로 제공하는 UI를 사용하지 않고 직접 구현할 수 있습니다.

...

CTA 버튼을 직접 구현하려면 다음의 절차를 따르세요.

  1. 뷰 레이아웃(view_customized_cta.xml)을 구현하세요.
    다음은 레이아웃 리소스로 뷰 레이아웃을 구현한 예시입니다.

    Code Block
    languagexml
    <!-- view_customized_cta.xml -->
    
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark">
        <!-- CTA 버튼의 텍스트 -->    
        <TextView
            android:id="@+id/textCta">
            
        <!-- CTA 버튼의 아이콘 이미지 -->
        <ImageView
            android:id="@+id/imageReward"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:src="아이콘 이미지 리소스" />
    
        <!-- CTA 버튼의 리워드 텍스트 -->
        <TextView
            android:id="@+id/textReward">
    </LinearLayout>
  2. CtaView 클래스를 상속하는 서브클래스인 CustomCtaView를 생성하세요.

  3. CtaView 클래스에서 사용하던 CTA View 레이아웃을 inflate하도록 구현하세요.

  4. 사용자의 광고 참여 상태에 따라 호출되는 아래의 오버라이딩 메소드에서 CTA 버튼의 아이콘 이미지, 텍스트, 리워드 값을 구현하세요.

    • renderViewParticipatingState : 사용자가 광고에 참여 중인 상태 (예: 액션형 광고의 랜딩 페이지에 진입한 상태)

    • renderViewParticipatedState : 사용자가 광고 참여를 완료한 상태

    • renderViewRewardAvailableState : 사용자가 아직 광고에 참여하지 않은 상태

    • renderViewRewardNotAvailableState : 사용자가 획득할 리워드가 없는 광고

      Code Block
      languagejava
      public class CustomCtaView extends CtaView {
          private final ImageView rewardImageView;
          private final TextView rewardTextView;
          private final TextView ctaTextView;
          
          public CustomCtaView(@NonNull Context context) {
              this(context, null);
          }
      
          public CustomCtaView(@NonNull Context context, @Nullable AttributeSet attrs) {
              this(context, attrs, 0);
          }
      
          public CustomCtaView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
              super(context, attrs, defStyleAttr);
              // TODO:  기존에 사용하던 CTA View 레이아웃을 inflate 하도록 구현하세요.
              inflate(getContext(), R.layout.view_customized_cta, this);
              this.rewardImageView = findViewById(R.id.imageReward);
              this.rewardTextView = findViewById(R.id.textReward);
              this.ctaTextView = findViewById(R.id.textCta);        
          }
      
          // CTA 텍스트 설정
          public void setCtaText(String ctaText) {
              ctaTextView.setText(ctaText);
          }
          // CTA 리워드 값 설정
          public void setRewardText(String rewardText) {
              rewardTextView.setText(rewardText);
          }
          // CTA 아이콘 설정
          public void setRewardIcon(@DrawableRes int iconResId) {
              rewardImageView.setImageResource(iconResId);
              rewardImageView.setVisibility(View.VISIBLE);
          }
          // CTA 아이콘 숨기기 처리
          public void hideRewardIcon() {
              rewardImageView.setVisibility(View.GONE);
          }   
          
          // 사용자가 광고에 참여 중인 상태
          @Override
          public void renderViewParticipatingState(@NonNull String callToAction) {
              setCtaText("참여 확인 중");
              hideRewardIcon();
              setRewardText("");
          }
          // 사용자가 광고 참여를 완료한 상태
          @Override
          public void renderViewParticipatedState(@NonNull String callToAction) {
              setRewardIcon(R.drawable.my_participated_icon);
              setRewardText("");
              setCtaText("참여 완료");
          }
          // 사용자가 아직 광고에 참여하지 않은 상태
          @Override
          public void renderViewRewardAvailableState(@NonNull String callToAction, int reward) {
              setRewardIcon(R.drawable.my_reward_icon);
              setRewardText(String.format(Locale.US, "+%,d", reward));
              setCtaText(callToAction);
          }
          // 사용자가 획득할 리워드가 없는 광고
          @Override
          public void renderViewRewardNotAvailableState(@NonNull String callToAction) {
              hideRewardIcon();
              setRewardText("");
              setCtaText(callToAction);
          }
      }
  5. 새로 생성한 CustomCtaView 클래스의 경로를 Feed 광고 레이아웃에 설정하세요.
    다음은 Feed 광고의 레이아웃 예시입니다.

    Code Block
    languagexml
    <com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView
        android:id="@+id/native_ad_view">
        <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"/>        
        <!-- TODO: 새로 생성한 CustomCtaView 클래스 경로를 설정합니다. -->
        <com.your.packagename.CustomCtaView
            android:id="@+id/customCtaView"/>
    </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView> 
  6. 다음 순서에 따라 직접 구현한 CTA 버튼을 Feed 광고에 반영하세요.

    1. Feed 광고 레이아웃에서 NativeAdView와 커스텀 CTA 버튼인 CustomCtaView를 가져오세요.

    2. loadAd()메소드를 호출한 후 Feed 광고가 성공적으로 할당되어 onAdLoaded 콜백 메소드가 호출되면, NativeAdViewBinderctaView 속성을 customCtaView로 설정하세요.

    3. bind()를 호출하여 광고 레이아웃에 광고 데이터를 바인딩하세요.

      Code Block
      languagejava
      // TODO: Feed 광고 레이아웃에서 NatieAdView와 구성 요소를 가져옵니다.  
      final NativeAdView nativeAdView = findViewById(R.id.your_native_ad_view);
      //... 생략 ...
      // TODO: Feed 광고 레이아웃에서 CustomCtaView를 가져옵니다. 
      final CustomCtaView customCtaView = nativeAdView.findViewById(R.id.customCtaView); 
      
      final NativeAdRequest nativeAdRequest = new NativeAdRequest.Builder().build();
      final BuzzAdNative buzzAdNative = new BuzzAdNative("YOUR_NATIVE_UNIT_ID");
      
      buzzAdNative.loadAd(nativeAdRequest, new BuzzAdNative.AdLoadListener() {
          @Override
          public void onAdLoaded(@NotNull NativeAd nativeAd) {
              // 할당된 광고가 있으면 호출됩니다. 
              // TODO: 광고 데이터를 바인딩할 때, ctaView 속성을 customCtaView로 설정합니다.
              final NativeAdViewBinder viewBinder = new NativeAdViewBinder.Builder(nativeAdView, mediaView)
                  .titleTextView(titleTextView)
                  .descriptionTextView(descriptionTextView)
                  .iconImageView(iconImageView)
                  .ctaView(customCtaView)
                  .build();
              viewBinder.bind(nativeAd);
          }
          // ... 생략 ...
      });
Info

SDK에서 제공하는 DefaultCtaView로 구현한 CTA 버튼의 디자인을 변경하려면 CTA 버튼 커스터마이징하기 토픽을 참고하세요.

사용자 프로필 입력 배너 노출 여부 설정하기

...

사용자가 출생연도 또는 성별 정보를 제공하지 않으면 헤더 영역에 프로필 정보를 입력하는 배너가 기본적으로 노출됩니다. FeedConfig를 수정하여 프로필 정보 입력 배너의 노출 여부를 설정할 수 있습니다. 다음은 프로필 입력 배너를 표시하지 않는 예시입니다.

...