How do I make SMART_BANNER ads from admob fill correctly in Android?

11,311

Solution 1

I Think your Admob banner is in Layout.

Put banner out side of all Layout and inner on Main Layout.Because you have used padding,Margin and Blah blah..

<Your Main Layout>
     <Secondary Layout>
        < Layout />
     </Secondary Layout>
//put your banner here
</Your Main Layout>

try this way.

Solution 2

Ensure that your outer layout does not have any padding

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"   // Change to 0dp
    android:paddingRight="0dp"  // Change to 0dp
    android:paddingTop="2dp"    >

Solution 3

If you want to use your second layout then you should give the relative layout a layout_weight of 1 (layout_weight only,applies to LinearLayouts). This will tell it to expand to fill any unused space in the containing LinearLayout.

Suggest you read http://developer.android.com/guide/topics/ui/declaring-layout.html to get a better understanding of Android layouts, you are using attributes from RelativeLayout and LinearLayout indiscriminately. Some of the layout attributes are only applicable to one type of layout.

<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    ...>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        .../>

    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        ...>

        <TextSwitcher
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            .../>
    </RelativeLayout>

    <com.google.ads.AdView
            android:id="@+id/bannerAd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            ads:adSize="SMART_BANNER"
            ads:adUnitId="@string/admobId"
     />
</LinearLayout>
Share:
11,311
BigTobster
Author by

BigTobster

Updated on July 12, 2022

Comments

  • BigTobster
    BigTobster almost 2 years

    I have a smart banner at the bottom of my portrait app.

    My layout looks like this:

    <RelativeLayout 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:paddingBottom="0dp"
            android:paddingLeft="0dp"
            android:paddingRight="0dp"
            android:paddingTop="0dp">
    
            <TextSwitcher
                ...
                Some TextSwitcher Stuff Here
                ... />
    
            <com.google.ads.AdView
                xmlns:googleads="http://schemas.android.com/apk/lib/com.google.ads"
                android:id="@+id/bannerAd"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:gravity="bottom"
                android:visibility="visible"
                googleads:adSize="SMART_BANNER"
                googleads:adUnitId="@string/admobId" />
    
        </RelativeLayout>
    

    My Manifest has appropriate permissions and this:

    <activity
                android:name="com.google.ads.AdActivity"
                android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" >
    </activity>
    

    And my ads are initialised by this code:

    private void initialiseAds()
        {
            AdView adView = (AdView) findViewById(R.id.bannerAd);
            adView.setAdListener(new MyAdListener(adView));
            AdRequest adRequest = new AdRequest();
            adRequest.addKeyword("games");
            adRequest.addKeyword("tabletop games");
            adRequest.addKeyword("board games");
            adRequest.addKeyword("monopoly");
            adRequest.addKeyword("gambling");
            adRequest.addKeyword("dice");
            final TelephonyManager tm =(TelephonyManager)getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
            String deviceId = tm.getDeviceId();
            adRequest.addTestDevice(deviceId);
            adView.loadAd(adRequest);
        }
    

    When I run the app, my ads do not display. LogCat gives me this:

    08-01 11:24:59.015: E/Ads(10436): Not enough space to show ad! Wants: <720, 100>, Has: <656, 935>
    08-01 11:24:59.020: E/Ads(10436): Not enough space to show ad! Wants: <720, 100>, Has: <656, 935>
    

    The device is a Galaxy S3. It seems to be getting the size requirements wrong ((720, 100) is surely too big for a phone banner app?).

    The SMART_BANNER is declared in XML so I cannot believe the AdView needs to be regenerated incode since it must already know the sizes on the first instantiation?

    Any ideas?

    EDIT:

    If I put SMART_BANNER inside only the most exterior Layout, this is the XML:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:paddingBottom="0dp"
        android:paddingLeft="0dp"
        android:paddingRight="0dp"
        android:paddingTop="0dp"
        tools:context=".MainActivity" >
    
        <Button
            android:id="@+id/btnRollDice"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:layout_marginLeft="@dimen/activity_horizontal_margin"
            android:layout_marginRight="@dimen/activity_horizontal_margin"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:contentDescription="@string/buttonDescription"
            android:onClick="rollDice"
            android:text="@string/btnRoll"
            android:textSize="40sp" />
    
        <RelativeLayout 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:paddingBottom="0dp"
            android:paddingLeft="0dp"
            android:paddingRight="0dp"
            android:paddingTop="0dp">
    
            <TextSwitcher
                android:id="@+id/diceValue"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:layout_gravity="center"
                android:animateFirstView="false"
                android:contentDescription="@string/textSwitcherDescription"
                android:inAnimation="@anim/slide_down"
                android:outAnimation="@anim/abc_fade_out"
                android:textAlignment="center"
                android:visibility="visible" />
    
        </RelativeLayout>
        <com.google.ads.AdView
                android:id="@+id/bannerAd"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_margin="0dp"
                ads:adSize="SMART_BANNER"
                ads:adUnitId="@string/admobId"
                android:gravity="bottom"
                android:padding="0dp"
                android:visibility="visible" />
    </LinearLayout>
    

    And this is the Error Message:

    08-01 12:59:38.120: E/Ads(22919): Not enough space to show ad! Wants: <720, 100>, Has: <720, 0>
    

    I suspect that this is because the RelativeLayout and Button have filled the LinearLayout and left no room for the AdView. Is there a way to assign a wrap_contents's worth of height to adview without impacting the RelativeLayout?

    Edit: Solution:

    This gets it about 95% of the way there (good enough :) ). The TextSwitcher is about 1% off dead center and it has a slightly capped height but you wouldn't really notice unless you stared and compared for hours. Hopefully this will help someone. Thanks to Harshid and William for the contributions.

    <!-- This is the XML for the Portrait View of the App
    It has 2 major tiers
    The first tier contains 3 items:
        The Ad Banner
        The button
        The 2nd Tier
    The second tier contains 1 item
        The TextSwitcher
    
    XML is pretty readable so just read it! :)
    
     -->
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:paddingBottom="0dp"
        android:paddingLeft="0dp"
        android:paddingRight="0dp"
        android:paddingTop="0dp"
        tools:context=".MainActivity"
        android:id="@+id/masterContainer">
    
    
        <com.google.ads.AdView
            android:id="@+id/bannerAd"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_margin="0dp"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            ads:adSize="SMART_BANNER"
            ads:adUnitId="@string/admobId"
            android:padding="0dp"
            android:visibility="visible" />
    
        <Button
            android:id="@+id/btnRollDice"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:layout_marginLeft="@dimen/activity_horizontal_margin"
            android:layout_marginRight="@dimen/activity_horizontal_margin"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:layout_marginBottom="0dp"
            android:paddingBottom="0dp"
            android:contentDescription="@string/buttonDescription"
            android:onClick="rollDice"
            android:text="@string/btnRoll"
            android:textSize="40sp" />
    
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_above="@id/bannerAd"
            android:layout_below="@id/btnRollDice"
            android:layout_margin="0dp"
            android:orientation="vertical"
            android:paddingBottom="0dp"
            android:paddingLeft="0dp"
            android:paddingRight="0dp"
            android:paddingTop="0dp" >
    
                <TextSwitcher
                    android:id="@+id/diceValue"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="false"
                    android:layout_alignParentLeft="false"
                    android:layout_alignParentRight="false"
                    android:layout_alignParentTop="false"
                    android:layout_centerHorizontal="false"
                    android:layout_centerInParent="true"
                    android:layout_centerVertical="false"
                    android:layout_gravity="center"
                    android:animateFirstView="false"
                    android:contentDescription="@string/textSwitcherDescription"
                    android:inAnimation="@anim/slide_down"
                    android:outAnimation="@anim/abc_fade_out"
                    android:textAlignment="center"
                    android:visibility="visible" />
    
            </RelativeLayout>
    
    </RelativeLayout>