自适应横幅广告
自适应横幅广告的类型
Yandex Mobile Ads SDK 提供三种类型的自适应横幅广告:
|
横幅广告 |
描述 |
使用场景 |
|
粘性横幅广告 |
固定在屏幕边缘并显示在其他元素之上的横幅广告。此类横幅广告不受屏幕滚动影响。 |
如果您希望横幅广告保持“固定效果”,即保持位置不变,即使用户滚动浏览屏幕也始终显示在内容上方。 |
|
内嵌横幅广告 |
嵌入应用中(例如,嵌入内容或列表中)的横幅广告,如同用户界面元素一样呈现。 |
横幅广告应成为页面内容的一部分,例如出现在动态消息中、帖子之间或作为列表项显示。 |
|
固定横幅广告 |
固定在特定位置或适用于固定高度空间的横幅广告。 |
当您需要在静态位置投放横幅广告时,例如在工具栏下方或屏幕底部。 |
所有类型的横幅广告都会每隔 60 秒自动更新一次广告创意。
从代码角度来看,这些横幅广告仅在尺寸设置方式上有所不同。例如:
粘性横幅广告
内嵌横幅广告
固定横幅广告
BannerAdSize.stickySize(context: Context, widthDp: Int)
BannerAdSize.inlineSize(widthDp: Int, heightDp: Int)
BannerAdSize.fixedSize(widthDp: Int)
备注
演示项目 中提供了展示所有格式类型运作原理的示例。
实体描述:
|
实体 |
描述 |
|
|
横幅广告高度:
所有横幅广告尺寸必须以 dp 为单位指定。 |
|
|
使用:
|
使用 XML 文件创建自适应横幅广告的示例
Kotlin
Java
activity_inline_banner_ad.xml
class InlineBannerAdActivity : AppCompatActivity(), BannerAdEventListener {
private var bannerAd: BannerAdView? = null
private var bannerAdSize: BannerAdSize? = null
private var currentAdUnitId: String? = null
private lateinit var binding: ActivityInlineBannerAdBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityInlineBannerAdBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btnLoadBanner.setOnClickListener {
configureBannerAdSize()
loadBannerAd()
}
binding.btnDestroyBanner.setOnClickListener {
destroyBanner()
}
bannerAd = binding.banner
configureBannerAdSize()
}
private fun configureBannerAdSize() {
bannerAdSize = BannerAdSize.inlineSize(this@InlineBannerAdActivity, 350, 60)
}
fun loadBannerAd() {
bannerAdSize?.let { bannerAdSize ->
val selectedAdUnitId = "demo-banner-yandex" // 使用 R-M-XXXXXX-Y 或演示广告单元(请参阅下方说明)
if (currentAdUnitId != selectedAdUnitId) {
destroyBanner()
createBanner(selectedAdUnitId, bannerAdSize)
}
val adRequest = AdRequest.Builder().build()
bannerAd?.loadAd(adRequest)
}
}
private fun createBanner(adUnitId: String, bannerAdSize: BannerAdSize) {
bannerAd = BannerAdView(this).apply {
setAdUnitId(adUnitId)
setAdSize(bannerAdSize)
setBannerAdEventListener(this@InlineBannerAdActivity)
}
val params = createLayoutParams(bannerAdSize)
binding.root.addView(bannerAd, params)
}
private fun createLayoutParams(size: BannerAdSize): ConstraintLayout.LayoutParams {
return ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.MATCH_PARENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT,
).apply {
bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID
}
}
private fun destroyBanner() {
bannerAd?.let {
it.destroy()
binding.root.removeView(it)
}
bannerAd = null
}
override fun onDestroy() {
destroyBanner()
super.onDestroy()
}
override fun onAdClicked() {}
override fun onAdFailedToLoad(error: AdRequestError) {}
override fun onAdLoaded() {}
override fun onImpression(impressionData: ImpressionData?) {}
override fun onLeftApplication() {}
override fun onReturnedToApplication() {}
}
public class InlineBannerAdActivity extends AppCompatActivity implements BannerAdEventListener {
private BannerAdView bannerAd = null;
private BannerAdSize bannerAdSize = null;
private String currentAdUnitId = null;
private ActivityInlineBannerAdBinding binding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityInlineBannerAdBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.btnLoadBanner.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
configureBannerAdSize();
loadBannerAd();
}
});
binding.btnDestroyBanner.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
destroyBanner();
}
});
bannerAd = binding.banner;
configureBannerAdSize();
}
private void configureBannerAdSize() {
bannerAdSize = BannerAdSize.inlineSize(this, 350, 60);
}
private void loadBannerAd() {
if (bannerAdSize != null) {
String selectedAdUnitId = "demo-banner-yandex"; // 使用 R-M-XXXXXX-Y 或演示广告单元
if (currentAdUnitId == null || !currentAdUnitId.equals(selectedAdUnitId)) {
destroyBanner();
createBanner(selectedAdUnitId, bannerAdSize);
currentAdUnitId = selectedAdUnitId;
}
AdRequest adRequest = new AdRequest.Builder().build();
if (bannerAd != null) {
bannerAd.loadAd(adRequest);
}
}
}
private void createBanner(String adUnitId, BannerAdSize bannerAdSize) {
bannerAd = new BannerAdView(this);
bannerAd.setAdUnitId(adUnitId);
bannerAd.setAdSize(bannerAdSize);
bannerAd.setBannerAdEventListener(this);
ConstraintLayout.LayoutParams params = createLayoutParams(bannerAdSize);
binding.getRoot().addView(bannerAd, params);
}
private ConstraintLayout.LayoutParams createLayoutParams(BannerAdSize size) {
ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.MATCH_PARENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
);
params.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID;
return params;
}
private void destroyBanner() {
if (bannerAd != null) {
bannerAd.destroy();
binding.getRoot().removeView(bannerAd);
bannerAd = null;
}
}
@Override
protected void onDestroy() {
destroyBanner();
super.onDestroy();
}
@Override
public void onAdClicked() {}
@Override
public void onAdFailedToLoad(@Nullable AdRequestError error) {}
@Override
public void onAdLoaded() {}
@Override
public void onImpression(@Nullable ImpressionData impressionData) {}
@Override
public void onLeftApplication() {}
@Override
public void onReturnedToApplication() {}
}
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".adunits.InlineBannerAdActivity">
<Button
android:id="@+id/btnLoadBanner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Load Banner"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<Button
android:id="@+id/btnDestroyBanner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Destroy Banner"
app:layout_constraintTop_toBottomOf="@id/btnLoadBanner"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp" />
<com.yandex.mobile.ads.banner.BannerAdView
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
使用以编程方式生成的活动创建自适应横幅广告的示例
Kotlin
Java
class InlineBannerAdActivity : AppCompatActivity(), BannerAdEventListener {
private lateinit var bannerAd: BannerAdView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val rootLayout = ConstraintLayout(this).apply {
layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)
}
val loadButton = Button(this).apply {
text = "Load Banner here"
id = View.generateViewId()
}
val destroyButton = Button(this).apply {
text = "Destroy Banner"
id = View.generateViewId()
}
rootLayout.addView(loadButton, LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
topToTop = LayoutParams.PARENT_ID
bottomToBottom = LayoutParams.PARENT_ID
startToStart = LayoutParams.PARENT_ID
endToEnd = LayoutParams.PARENT_ID
})
rootLayout.addView(destroyButton, LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
topToBottom = loadButton.id
startToStart = LayoutParams.PARENT_ID
endToEnd = LayoutParams.PARENT_ID
topMargin = 24
})
setContentView(rootLayout)
val bannerSize = BannerAdSize.inlineSize(this, 320, 50)
loadButton.setOnClickListener {
destroyBannerIfNeeded(rootLayout)
bannerAd = BannerAdView(this).apply {
id = View.generateViewId()
setAdUnitId("demo-banner-yandex") // 使用 R-M-XXXXXX-Y 或演示广告单元(请参阅下方说明)
setAdSize(bannerSize)
setBannerAdEventListener(this@InlineBannerAdActivity)
}
rootLayout.addView(
bannerAd,
LayoutParams(MATCH_PARENT, WRAP_CONTENT).apply {
bottomToBottom = LayoutParams.PARENT_ID
bottomMargin = 32
}
)
bannerAd.loadAd(AdRequest.Builder().build())
}
destroyButton.setOnClickListener {
destroyBannerIfNeeded(rootLayout)
}
}
private fun destroyBannerIfNeeded(container: ConstraintLayout) {
if (::bannerAd.isInitialized) {
bannerAd.destroy()
container.removeView(bannerAd)
}
}
override fun onDestroy() {
if (::bannerAd.isInitialized) {
bannerAd.destroy()
(bannerAd.parent as? ConstraintLayout)?.removeView(bannerAd)
}
super.onDestroy()
}
override fun onAdClicked() {}
override fun onAdFailedToLoad(error: AdRequestError) {}
override fun onAdLoaded() {}
override fun onImpression(impressionData: ImpressionData?) {}
override fun onLeftApplication() {}
override fun onReturnedToApplication() {}
}
public class InlineBannerAdActivity extends AppCompatActivity implements BannerAdEventListener {
private BannerAdView bannerAd;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ConstraintLayout rootLayout = new ConstraintLayout(this);
rootLayout.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
final Button loadButton = new Button(this);
loadButton.setText("Load Banner here");
loadButton.setId(View.generateViewId());
final Button destroyButton = new Button(this);
destroyButton.setText("Destroy Banner");
destroyButton.setId(View.generateViewId());
LayoutParams loadBtnParams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
loadBtnParams.topToTop = LayoutParams.PARENT_ID;
loadBtnParams.bottomToBottom = LayoutParams.PARENT_ID;
loadBtnParams.startToStart = LayoutParams.PARENT_ID;
loadBtnParams.endToEnd = LayoutParams.PARENT_ID;
rootLayout.addView(loadButton, loadBtnParams);
LayoutParams destroyBtnParams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
destroyBtnParams.topToBottom = loadButton.getId();
destroyBtnParams.startToStart = LayoutParams.PARENT_ID;
destroyBtnParams.endToEnd = LayoutParams.PARENT_ID;
destroyBtnParams.topMargin = 24;
rootLayout.addView(destroyButton, destroyBtnParams);
setContentView(rootLayout);
final BannerAdSize bannerSize = BannerAdSize.inlineSize(this, 320, 50);
loadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
destroyBannerIfNeeded(rootLayout);
bannerAd = new BannerAdView(InlineBannerAdActivity.this);
bannerAd.setId(View.generateViewId());
bannerAd.setAdUnitId("demo-banner-yandex"); // 使用 R-M-XXXXXX-Y 或演示广告单元
bannerAd.setAdSize(bannerSize);
bannerAd.setBannerAdEventListener(InlineBannerAdActivity.this);
LayoutParams bannerParams = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
bannerParams.bottomToBottom = LayoutParams.PARENT_ID;
bannerParams.bottomMargin = 32;
rootLayout.addView(bannerAd, bannerParams);
bannerAd.loadAd(new AdRequest.Builder().build());
}
});
destroyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
destroyBannerIfNeeded(rootLayout);
}
});
}
private void destroyBannerIfNeeded(ConstraintLayout container) {
if (bannerAd != null) {
bannerAd.destroy();
container.removeView(bannerAd);
bannerAd = null;
}
}
@Override
protected void onDestroy() {
if (bannerAd != null) {
bannerAd.destroy();
View parent = (View) bannerAd.getParent();
if (parent instanceof ConstraintLayout) {
((ConstraintLayout) parent).removeView(bannerAd);
}
bannerAd = null;
}
super.onDestroy();
}
@Override
public void onAdClicked() {}
@Override
public void onAdFailedToLoad(@Nullable AdRequestError error) {}
@Override
public void onAdLoaded() {}
@Override
public void onImpression(@Nullable ImpressionData impressionData) {}
@Override
public void onLeftApplication() {}
@Override
public void onReturnedToApplication() {}
}
检查集成
创建并运行您的项目。您可以通过在 Logcat 中搜索 YandexAds 关键字来检查集成是否成功:
[Integration] Ad type banner was integrated successfully