以编程方式设置时,必须在loadAd之前设置广告尺寸和广告单元ID

时间:2015-12-11 20:14:44

标签: java android admob adview

我不知道这里发生了什么,但我试图通过下面的代码动态设置我的广告单元ID并将其从XML中移除但仍然会收到错误:

  

广告尺寸和广告单元ID必须在调用loadAd之前设置。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
       <com.google.android.gms.ads.AdView
            android:id="@+id/adView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_alignParentBottom="true"
            ads:adSize="SMART_BANNER">
        </com.google.android.gms.ads.AdView>

    AdView mAdView = (AdView) rootView.findViewById(R.id.adView);
    mAdView.setAdUnitId(getEvent().getAdMobUnitId());
    AdRequest adRequest = new AdRequest.Builder().build();
    mAdView.loadAd(adRequest);

8 个答案:

答案 0 :(得分:49)

以编程方式创建

View adContainer = findViewById(R.id.adMobView);

AdView mAdView = new AdView(context);
mAdView.setAdSize(AdSize.BANNER);
mAdView.setAdUnitId(YOUR_BANNER_ID);
((RelativeLayout)adContainer).addView(mAdView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);

在你的xml文件中

<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">

        <RelativeLayout 
            android:id="@+id/adMobView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true"/>

</RelativeLayout>

修改

横幅的最佳做法是,每个视图两个显示一个横幅(一个unitId),如果要在同一个屏幕中显示更多横幅(不推荐),则必须创建另一个{{1}来自console,每个unitId都有一个adView。

我的回答是:

不知道它是否是一个错误,或者每个adView只能有一个unitId并且它更有意义,因为每个adView只能有一个unitId,并且从{{读取3}}他们通过实例化新的unitId并以编程方式设置AdView()unitIds来显示两种方法。 只从XML做。

我做了一些测试来得出这个结论。

使用sizes

中的findViewById

1 - 如果先设置com.google.android.gms.ads.AdView,则可以以编程方式setAdUnitId

2 - 如果它已经在您的xml中,则不能以adSize编程。

3 - 如果您未在xml中使用“setAdUnitId”,即使您以编程方式设置这两个属性,它也会向setAdUnitId发出警报,Required xml attribute adUnitId was missing也会发出相同的警告。

4 - 如果没有放置adSizesetAdUnitId并以编程方式放置,则adView会提醒您setSize,如果您未在xml中设置Required xml attribute adUnitId was missing则相同。

5 - 您可以通过编程方式执行adSize加载广告

使用mAdView.loadAd(adRequest)

1 - 如果您创建一个空布局,然后将adView引用添加到此视图,它将起作用。

2 - 您可以通过编程方式设置new AdView()adSize

3-如果您尝试使用adUnitId两次,如果您使用setAdUnitAd

,此异常将启动The ad unit ID can only be set once on AdView.

我的结论是:

您只能使用XML“

findViewById

并在onCreate上加载视图

<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-my_id_number_was_ommited_by_security" />

或以编程方式完整

AdView mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);

我长时间使用横幅,答案对我有好处。

答案 1 :(得分:5)

xmlns:ads="http://schemas.android.com/apk/res-auto" 

这解决了我的问题。

请勿使用

xmlns:ads="http://schemas.android.com/tools" 

答案 2 :(得分:1)

你有

android:layout_width="wrap_content"
android:layout_height="wrap_content"

自: https://developers.google.com/admob/android/banner#smart_banners

  

注意:布局中的智能横幅视图必须占用设备的整个宽度。如果没有,您会收到一条警告,上面显示“没有足够的空间展示广告”,并且不会显示横幅。

将其更改为

android:layout_width="match_parent"

并在xml文件中设置您的adUnitID。

ads:adUnitId="AD_UNIT_ID"

答案 3 :(得分:0)

对我来说,我设置的广告类型如下:

ads:adSize="Banner"

虽然它应全部上限:

ads:adSize="BANNER"

答案 4 :(得分:0)

我已经这样做了

<LinearLayout xmlns:ads="http://schemas.android.com/apk/res-auto"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">



<LinearLayout
    android:id="@+id/ll_main_screen_container"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="wrap_content"
    android:orientation="horizontal"/>

</LinearLayout>

代码

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.newone);
    initAdsAccount();
    initAds();
}

private void initAdsAccount()
{
    String accountId = AdsConstants.my_fake_ads_account_id;

    if (AdsConstants.isAdsMode)
    {
        accountId = AdsConstants.my_ads_account_id;
    }

    MobileAds.initialize(this, accountId);
}

private void initAds()
{
    findViewById(R.id.ll_main_screen_container).post(//
            new Runnable()
            {
                @Override
                public void run()
                {
                    LinearLayout adContainer = findViewById(R.id.ll_main_screen_container);
                    AdView mAdView = new AdView(MainActivity.this);
                    mAdView.setAdSize(AdSize.BANNER);

                    if (AdsConstants.isAdsMode)
                    {
                        mAdView.setAdUnitId(AdsConstants.main_screen_bottom_banner_id);
                    }
                    else
                    {
                        mAdView.setAdUnitId(AdsConstants.fake_banner_id);
                    }

                    adContainer.addView(mAdView);
                    AdRequest adRequest = new AdRequest.Builder().build();
                    mAdView.loadAd(adRequest);
                }
            }//
    );
}

答案 5 :(得分:0)

尝试后,

  1. 仅提供广告单元ID,并通过xml进行adsize。
  2. 仅提供adunit ID并从.java文件中进行adize。

问题由

解决
  1. 从根目录布局中删除xmlns:ads="http://schemas.android.com/apk/res-auto"行。
  2. 提供广告单元ID并按以下方式广告化

    app:adSize="SMART_BANNER" app:adUnitId="@string/banner_ad_unit_id"

    1. 清洁并运行应用程序。

答案 6 :(得分:0)

将此添加到您的布局

xmlns:ads="http://schemas.android.com/apk/res-auto" 

答案 7 :(得分:-1)

尝试在XML中设置广告单元ID

ads:adUnitId="INSERT_YOUR_AD_UNIT_ID_HERE"

ads:adUnitId="ca-app-pub-3940256099942544/6300978"

或查找链接以获取更多详细信息 https://developers.google.com/admob/android/quick-start