Native Ad
1. 기본 요건
ADX Android SDK를 프로젝트에 추가합니다.
Native Ad용으로 발급받은 Ad Unit ID를 사용합니다.
광고를 요청하기 전에 SDK 초기화를 먼저 진행합니다.
SDK 초기화는 앱 실행 시 한 번만 호출하여 주시고, 광고 요청은 초기화가 완료된 후에 이뤄져야 합니다.
2. 레이아웃 설정
Native Ad의 경우, 광고에 사용 될 레이아웃을 직접 구성해야 합니다. 필수 구성 요소들은 다음과 같습니다.
Title :
TextView
Main Text :
TextView
Call-To-Action :
Button
Icon Image :
ImageView
Main Image :
FrameLayout
Privacy Icon :
FrameLayout
Ad Tag :
TextView 또는 ImageView
Ad Tag 요소는 "Ad" 또는 "Advertisement" 문자열을 보여주는 UI 구성 요소를 포함하여, 광고라는 것을 명확하게 사용자에게 인식을 시켜야 합니다. 이 요소가 포함되지 않으면, 일부 광고 네트워크의 광고 송출이 중단될 수 있습니다.
이 요소들은 반드시 포함하여 구성하여 주시고, 광고 컨텐츠를 덮는 Layer가 없어야 합니다. 또한 텍스트 변경, 이미지 변경, 터치 시 액션 변경 등 광고 컨텐츠에 관련된 부분을 가공하거나 변경하지 않도록 주의 부탁드립니다.
샘플 소스의 layout_adx_native_ad.xml을 참조하실 수 있습니다.
3. 구현
Native Ad는 다음 3가지 방법 중 하나로 광고를 로드할 수 있습니다.
Case 1: 하나의 View로 사용하는 경우
MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AdxNativeAdFactory.init(this);
// for Native Ad
AdxNativeAdFactory.setAdxViewBinder("<NATIVE_AD_UNIT_ID>"),
new AdxViewBinder.Builder(R.layout.layout_media_native_ad)
.mediaViewContainerId(R.id.mediaContainerId)
.iconImageId(R.id.adIconId)
.titleId(R.id.titleId)
.adChoiceContainerId(R.id.adChoicesContainerId)
.callToActionId(R.id.callToActionId)
.build());
AdxNativeAdFactory.preloadAd("<NATIVE_AD_UNIT_ID>");
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_native_ad_factory)
AdxNativeAdFactory.init(this)
AdxNativeAdFactory.setAdxViewBinder("<NATIVE_AD_UNIT_ID>",
AdxViewBinder.Builder(R.layout.layout_media_native_ad)
.mediaViewContainerId(R.id.mediaContainerId)
.iconImageId(R.id.adIconId)
.titleId(R.id.titleId)
.adChoiceContainerId(R.id.adChoicesContainerId)
.callToActionId(R.id.callToActionId)
.build()
AdxNativeAdFactory.preloadAd("<NATIVE_AD_UNIT_ID>")
}
Activity (or Fragment)
private View mAdView;
private com.adxcorp.ads.nativeads.NativeAd mNativeAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_native_ad_factory);
AdxNativeAdFactory.addListener(mListener);
AdxNativeAdFactory.loadAd("<NATIVE_AD_UNIT_ID>");
}
@Override
protected void onDestroy() {
AdxNativeAdFactory.removeListener(mListener);
if(mNativeAd != null) {
mNativeAd.destroy();
mNativeAd = null;
}
super.onDestroy();
}
private final AdxNativeAdFactory.NativeAdListener mListener = new AdxNativeAdFactory.NativeAdListener() {
@Override
public void onSuccess(String s, com.adxcorp.ads.nativeads.NativeAd nativeAd) {
if ("<NATIVE_AD_UNIT_ID>".equals(s)) {
mNativeAd = nativeAd;
mAdView = AdxNativeAdFactory.getNativeAdView(
NativeAdFactoryActivity.this,
s,
mContentView,
new com.adxcorp.ads.nativeads.NativeAd.NativeEventListener() {
@Override
public void onImpression(View view) {
}
@Override
public void onClick(View view) {
}
});
mContentView.addView(mAdView);
}
}
@Override
public void onFailure(String s) {
}
};
private var mAdView: View? = null
private var mNativeAd: NativeAd? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_native_ad_factory)
AdxNativeAdFactory.addListener(mListener)
AdxNativeAdFactory.loadAd("<NATIVE_AD_UNIT_ID>")
}
override fun onDestroy() {
super.onDestroy()
AdxNativeAdFactory.removeListener(mListener)
mNativeAd?.destroy()
mNativeAd = null
}
private val mListener: AdxNativeAdFactory.NativeAdListener = object : AdxNativeAdFactory.NativeAdListener {
override fun onSuccess(s: String, nativeAd: NativeAd) {
if ("<NATIVE_AD_UNIT_ID>" == s) {
mNativeAd = nativeAd
mAdView = AdxNativeAdFactory.getNativeAdView(
this@NativeAdFactoryActivity,
s,
mContentView,
object : NativeAd.NativeEventListener {
override fun onImpression(view: View) {
}
override fun onClick(view: View) {
}
})
mContentView?.addView(mAdView)
}
}
override fun onFailure(s: String) {
}
}
Case 2: RecyclerView를 사용하는 경우
MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AdxNativeAdFactory.init(this);
// for Native Ad
AdxNativeAdFactory.setAdxViewBinder("<NATIVE_AD_UNIT_ID>"),
new AdxViewBinder.Builder(R.layout.layout_media_native_ad)
.mediaViewContainerId(R.id.mediaContainerId)
.iconImageId(R.id.adIconId)
.titleId(R.id.titleId)
.adChoiceContainerId(R.id.adChoicesContainerId)
.callToActionId(R.id.callToActionId)
.build());
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_native_ad_factory)
AdxNativeAdFactory.init(this)
AdxNativeAdFactory.setAdxViewBinder("<NATIVE_AD_UNIT_ID>",
AdxViewBinder.Builder(R.layout.layout_media_native_ad)
.mediaViewContainerId(R.id.mediaContainerId)
.iconImageId(R.id.adIconId)
.titleId(R.id.titleId)
.adChoiceContainerId(R.id.adChoicesContainerId)
.callToActionId(R.id.callToActionId)
.build()
}
Acivity (or Fragment)
리스트에서 광고 고정 위치와 반복 위치를 소스 코드에 직접 지정해야 합니다.
private AdxRecyclerAdapter mRecyclerAdapter;
private RecyclerView mRecyclerView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_native_ad_recyclerview);
mRecyclerView = (RecyclerView) findViewById(R.id.native_recycler_view);
final RecyclerView.Adapter originalAdapter = new DemoRecyclerAdapter();
// 광고 고정 및 반복 위치 지정
NativeAdPosition.ClientPosition clientPosition = new NativeAdPosition.ClientPosition();
clientPosition.addFixedPosition(2);
clientPosition.enableRepeatingPositions(5);
mRecyclerAdapter = AdxNativeAdFactory.getAdxRecyclerAdapter(this, originalAdapter, "<Insert_ADX_AdUnitId>", clientPosition);
mRecyclerView.setAdapter(mRecyclerAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerAdapter.loadAds("<NATIVE_AD_UNIT_ID>");
}
@Override
protected void onDestroy() {
super.onDestroy();
mRecyclerAdapter.destroy();
}
private var mRecyclerAdapter: AdxRecyclerAdapter? = null
private var mRecyclerView: RecyclerView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_native_ad_recyclerview)
mRecyclerView = findViewById<View>(R.id.native_recycler_view) as RecyclerView
val originalAdapter: RecyclerView.Adapter<*> = DemoRecyclerAdapter()
// 광고 고정 및 반복 위치 지정
val clientPosition = NativeAdPosition.ClientPosition()
clientPosition.addFixedPosition(2)
clientPosition.enableRepeatingPositions(5)
mRecyclerAdapter = AdxNativeAdFactory.getAdxRecyclerAdapter(this, originalAdapter, "<Insert_ADX_AdUnitId>", clientPosition)
mRecyclerView?.adapter = mRecyclerAdapter
mRecyclerView?.layoutManager = LinearLayoutManager(this)
mRecyclerAdapter?.loadAds("<Insert_ADX_AdUnitId>")
}
override fun onDestroy() {
super.onDestroy()
mRecyclerAdapter?.destroy()
}
Case 3: Closed Native Ad 사용 시
담당 매니저와 협의 후, Close Native Ad 용으로 발급 된 AdUnit ID를 사용하여 아래와 같이 구현합니다.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_wall);
AdxCloseAdFactory.init(this, "<NATIVE_AD_UNIT_ID>", "Exit Message");
AdxCloseAdFactory.preloadAd();
}
@Override
public void onBackPressed() {
AdxCloseAdFactory.showCloseAd(this, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
finish();
}
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
}
@Override
protected void onDestroy() {
AdxCloseAdFactory.destroy();
super.onDestroy();
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AdxCloseAdFactory.init(this, "<NATIVE_AD_UNIT_ID>", "Exit Message")
AdxCloseAdFactory.preloadAd()
}
override fun onBackPressed() {
AdxCloseAdFactory.showCloseAd(this, { _, _ ->
finish()
}) {}
}
override fun onDestroy() {
AdxCloseAdFactory.destroy()
super.onDestroy()
}
Last updated