Skip to main content

Overview

Banner ads are rectangular ads displayed in a portion of the screen. They can be implemented using both XML layout and code.

Key Features

  • Can be fixed at the top, bottom, or middle of the screen
  • Supports image and video ads
  • Supports both XML layout and programmatic implementation
  • Handle ad events through listeners
Use test unit ID during development: PUBLIC_TEST_UNIT_ID_320_100

XML Layout Implementation

Define AdropBanner in XML layout and load it in Activity or Fragment.

1. Define XML Layout

Place AdropBanner in a FrameLayout or other container.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Main content -->
    <TextView
        android:id="@+id/content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Main Content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <!-- Banner ad container -->
    <FrameLayout
        android:id="@+id/banner_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

        <io.adrop.ads.banner.AdropBanner
            android:id="@+id/adrop_banner"
            android:layout_width="320dp"
            android:layout_height="100dp"
            android:layout_gravity="center"
            app:adrop_unit_id="YOUR_UNIT_ID" />

    </FrameLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

2. Load in Activity

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import io.adrop.ads.banner.AdropBanner
import io.adrop.ads.banner.AdropBannerListener
import io.adrop.ads.model.AdropErrorCode

class MainActivity : AppCompatActivity() {
    private var banner: AdropBanner? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1. Find banner view defined in XML
        banner = findViewById(R.id.adrop_banner)

        // 2. Set listener
        banner?.listener = object : AdropBannerListener {
            override fun onAdReceived(banner: AdropBanner) {
                println("Banner ad received successfully")
            }

            override fun onAdFailedToReceive(banner: AdropBanner, errorCode: AdropErrorCode) {
                println("Banner ad failed to receive: $errorCode")
            }

            override fun onAdImpression(banner: AdropBanner) {
                println("Banner ad impression")
            }

            override fun onAdClicked(banner: AdropBanner) {
                println("Banner ad clicked")
            }
        }

        // 3. Load ad
        banner?.load()
    }

    override fun onDestroy() {
        super.onDestroy()
        // 4. Release memory
        banner?.destroy()
        banner = null
    }
}

XML Attributes

AttributeDescriptionRequired
app:adrop_unit_idAd unit IDO
android:layout_widthBanner width (dp)O
android:layout_heightBanner height (dp)O

Programmatic Implementation

Create AdropBanner instance directly in code and add it to the view.
import android.os.Bundle
import android.widget.FrameLayout
import androidx.appcompat.app.AppCompatActivity
import io.adrop.ads.banner.AdropBanner
import io.adrop.ads.banner.AdropBannerListener
import io.adrop.ads.model.AdropErrorCode

class MainActivity : AppCompatActivity() {
    private var banner: AdropBanner? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1. Create banner instance
        banner = AdropBanner(this).apply {
            unitId = "YOUR_UNIT_ID"

            // 2. Set listener
            listener = object : AdropBannerListener {
                override fun onAdReceived(banner: AdropBanner) {
                    println("Banner ad received successfully")
                }

                override fun onAdFailedToReceive(banner: AdropBanner, errorCode: AdropErrorCode) {
                    println("Banner ad failed to receive: $errorCode")
                }

                override fun onAdImpression(banner: AdropBanner) {
                    println("Banner ad impression")
                }

                override fun onAdClicked(banner: AdropBanner) {
                    println("Banner ad clicked")
                }
            }
        }

        // 3. Add to view hierarchy
        val container = findViewById<FrameLayout>(R.id.banner_container)
        val params = FrameLayout.LayoutParams(
            FrameLayout.LayoutParams.MATCH_PARENT,
            FrameLayout.LayoutParams.WRAP_CONTENT
        )
        container.addView(banner, params)

        // 4. Load ad
        banner?.load()
    }

    override fun onDestroy() {
        super.onDestroy()
        // 5. Release memory
        banner?.destroy()
        banner = null
    }
}

AdropBanner Initialization

Constructor

context
Context
required
Activity or Application Context
val banner = AdropBanner(context)

Set Unit ID

unitId
String
required
Unit ID created in Ad Control console
banner.unitId = "YOUR_UNIT_ID"

Load Ad

Call load() method after adding the banner to the screen to request ads.
banner.load()
Call load() when the banner is visible on screen. Loading when not visible may result in inaccurate impression measurement.

Listener Implementation

The AdropBannerListener interface handles ad lifecycle events.

onAdReceived (Required)

Called when ad is successfully received.
override fun onAdReceived(banner: AdropBanner) {
    println("Banner ad received successfully")
    // Hide loading indicator, etc.
}

onAdFailedToReceive (Required)

Called when ad fails to receive.
override fun onAdFailedToReceive(banner: AdropBanner, errorCode: AdropErrorCode) {
    println("Banner ad failed to receive: $errorCode")
    // Handle error and show fallback content
}
errorCode
AdropErrorCode
Code indicating error type. See Reference for details.

onAdImpression (Optional)

Called when ad is displayed on screen.
override fun onAdImpression(banner: AdropBanner) {
    println("Banner ad impression")
    // Log impression analytics, etc.
}

onAdClicked (Optional)

Called when user clicks the ad.
override fun onAdClicked(banner: AdropBanner) {
    println("Banner ad clicked")
    // Log click analytics, etc.
}

Context ID Setting

You can set Context ID for contextual targeting.
banner.contextId = "article_123"
Context ID must be set before loading the ad.

Lifecycle Management

destroy()

Always call destroy() to release resources when the banner is no longer used.
override fun onDestroy() {
    super.onDestroy()
    banner?.destroy()
    banner = null
}
Memory leaks may occur if destroy() is not called.

Ad Sizes

Banner ads should have view size matching the unit settings.

Common Banner Sizes

SizeUsage
320 x 50Small banner
320 x 100Medium banner
16:9 ratioVideo banner

Specify Size in XML

<io.adrop.ads.banner.AdropBanner
    android:id="@+id/adrop_banner"
    android:layout_width="320dp"
    android:layout_height="100dp"
    app:adrop_unit_id="YOUR_UNIT_ID" />

Specify Size in Code

val params = FrameLayout.LayoutParams(
    dpToPx(320), // width
    dpToPx(100)   // height
)
container.addView(banner, params)

// Utility function to convert dp to px
fun dpToPx(dp: Int): Int {
    val density = resources.displayMetrics.density
    return (dp * density).toInt()
}

Test Unit IDs

Use the following test unit IDs during development and testing.
Ad TypeTest Unit IDSize
Banner (320x50)PUBLIC_TEST_UNIT_ID_320_50320 x 50
Banner (320x100)PUBLIC_TEST_UNIT_ID_320_100320 x 100
Carousel BannerPUBLIC_TEST_UNIT_ID_CAROUSELVariable
Banner Video (16:9)PUBLIC_TEST_UNIT_ID_BANNER_VIDEO_16_916:9 ratio
Banner Video (9:16)PUBLIC_TEST_UNIT_ID_BANNER_VIDEO_9_169:16 ratio

Usage Example

import io.adrop.ads.AdropUnitId

val banner = AdropBanner(this).apply {
    unitId = AdropUnitId.PUBLIC_TEST_UNIT_ID_320_100
}

Best Practices

1. Memory Management

Always release the banner when Activity or Fragment is destroyed.
override fun onDestroy() {
    super.onDestroy()
    banner?.destroy()
    banner = null
}

2. Screen Visibility

Load ads when the banner is visible on screen.
override fun onResume() {
    super.onResume()
    banner?.load()
}

3. Error Handling

Implement proper error handling when ad load fails.
override fun onAdFailedToReceive(banner: AdropBanner, errorCode: AdropErrorCode) {
    when (errorCode) {
        AdropErrorCode.ERROR_CODE_NETWORK_ERROR -> {
            println("Network error: Check connection")
        }
        AdropErrorCode.ERROR_CODE_NO_FILL -> {
            println("No ads available")
        }
        else -> {
            println("Ad load failed: $errorCode")
        }
    }
}

4. Using in RecyclerView

Properly manage banners in ViewHolder when using in RecyclerView.
class BannerViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    private val banner: AdropBanner = view.findViewById(R.id.adrop_banner)

    fun bind() {
        banner.listener = object : AdropBannerListener {
            // Implement listener
        }
        banner.load()
    }

    fun recycle() {
        banner.destroy()
    }
}

// In adapter
override fun onViewRecycled(holder: BannerViewHolder) {
    holder.recycle()
}

Complete Example

Kotlin Example

import android.os.Bundle
import android.view.View
import android.widget.FrameLayout
import android.widget.ProgressBar
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import io.adrop.ads.banner.AdropBanner
import io.adrop.ads.banner.AdropBannerListener
import io.adrop.ads.model.AdropErrorCode

class BannerActivity : AppCompatActivity() {
    private var banner: AdropBanner? = null
    private lateinit var progressBar: ProgressBar

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_banner)

        progressBar = findViewById(R.id.progress_bar)
        setupBanner()
    }

    private fun setupBanner() {
        // 1. Create banner instance
        banner = AdropBanner(this).apply {
            unitId = "YOUR_UNIT_ID"

            // Context ID setting (optional)
            contextId = "article_123"

            // 2. Set listener
            listener = object : AdropBannerListener {
                override fun onAdReceived(banner: AdropBanner) {
                    println("Banner ad received successfully")
                    progressBar.visibility = View.GONE
                }

                override fun onAdFailedToReceive(banner: AdropBanner, errorCode: AdropErrorCode) {
                    println("Banner ad failed to receive: $errorCode")
                    progressBar.visibility = View.GONE

                    // Handle based on error
                    when (errorCode) {
                        AdropErrorCode.ERROR_CODE_NETWORK_ERROR -> {
                            showToast("Please check network connection")
                        }
                        AdropErrorCode.ERROR_CODE_NO_FILL -> {
                            println("No ads available")
                        }
                        else -> {
                            showToast("Unable to load ad")
                        }
                    }
                }

                override fun onAdImpression(banner: AdropBanner) {
                    println("Banner ad impression")
                }

                override fun onAdClicked(banner: AdropBanner) {
                    println("Banner ad clicked")
                }
            }
        }

        // 3. Add to view hierarchy
        val container = findViewById<FrameLayout>(R.id.banner_container)
        val params = FrameLayout.LayoutParams(
            dpToPx(320),
            dpToPx(100)
        )
        container.addView(banner, params)

        // 4. Load ad
        progressBar.visibility = View.VISIBLE
        banner?.load()
    }

    private fun dpToPx(dp: Int): Int {
        val density = resources.displayMetrics.density
        return (dp * density).toInt()
    }

    private fun showToast(message: String) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }

    override fun onDestroy() {
        super.onDestroy()
        // 5. Release memory
        banner?.destroy()
        banner = null
    }
}

Java Example

import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import io.adrop.ads.banner.AdropBanner;
import io.adrop.ads.banner.AdropBannerListener;
import io.adrop.ads.model.AdropErrorCode;
import org.jetbrains.annotations.NotNull;

public class BannerActivity extends AppCompatActivity {
    private AdropBanner banner;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_banner);

        progressBar = findViewById(R.id.progress_bar);
        setupBanner();
    }

    private void setupBanner() {
        // 1. Create banner instance
        banner = new AdropBanner(this);
        banner.setUnitId("YOUR_UNIT_ID");

        // Context ID setting (optional)
        banner.setContextId("article_123");

        // 2. Set listener
        banner.setListener(new AdropBannerListener() {
            @Override
            public void onAdReceived(@NotNull AdropBanner banner) {
                System.out.println("Banner ad received successfully");
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onAdFailedToReceive(@NotNull AdropBanner banner, @NotNull AdropErrorCode errorCode) {
                System.out.println("Banner ad failed to receive: " + errorCode);
                progressBar.setVisibility(View.GONE);

                // Handle based on error
                if (errorCode == AdropErrorCode.ERROR_CODE_NETWORK_ERROR) {
                    showToast("Please check network connection");
                } else if (errorCode == AdropErrorCode.ERROR_CODE_NO_FILL) {
                    System.out.println("No ads available");
                } else {
                    showToast("Unable to load ad");
                }
            }

            @Override
            public void onAdImpression(@NotNull AdropBanner banner) {
                System.out.println("Banner ad impression");
            }

            @Override
            public void onAdClicked(@NotNull AdropBanner banner) {
                System.out.println("Banner ad clicked");
            }
        });

        // 3. Add to view hierarchy
        FrameLayout container = findViewById(R.id.banner_container);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
            dpToPx(320),
            dpToPx(100)
        );
        container.addView(banner, params);

        // 4. Load ad
        progressBar.setVisibility(View.VISIBLE);
        banner.load();
    }

    private int dpToPx(int dp) {
        float density = getResources().getDisplayMetrics().density;
        return (int) (dp * density);
    }

    private void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 5. Release memory
        if (banner != null) {
            banner.destroy();
            banner = null;
        }
    }
}

XML Layout

activity_banner.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Banner Ad Example"
        android:textSize="24sp"
        android:textStyle="bold"
        android:layout_marginTop="32dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <FrameLayout
        android:id="@+id/banner_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Next Steps