【问题标题】:How to specify adUnitId programmatically for AdMob?如何以编程方式为 AdMob 指定 adUnitId?
【发布时间】:2014-07-15 19:10:34
【问题描述】:

我正在尝试以编程方式将 adUnitId 设置为来自新 Google Play 服务(旧 AdMob)的广告。

我在 XML 中有这个(用于<include>):

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

这在 onCreate():

AdView mAdview = (AdView)findViewById(R.id.adView);
    mAdview.setAdUnitId(((App)getApplication()).getAdmobKey());

    mAdview.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            findViewById(R.id.adView).setVisibility(View.VISIBLE);
        }
    });

    AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
            .build();
    mAdview.loadAd(adRequest);

我得到:

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

因此,第二种选择是以编程方式制作广告。

新的 XML:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:id="@+id/adView"
    />

新代码:

AdView mAdview = new AdView(this);
...
((LinearLayout)findViewById(R.id.adView)).addView(mAdview);
mAdview.loadAd(adRequest);

但我得到了同样的错误。

我也尝试从 com.google.android.gms.ads.AdView 继承来制作自定义视图,但它是最终的。

有什么建议吗?

【问题讨论】:

  • 我认为这种反应已经过时了。我没有构造函数 AdView(, , )
  • 我遇到了同样的问题,同样的异常。仅当 adUnitId 在 xml 中时才有效。
  • getAdmobKey() 是做什么的?
  • 返回一个带有 adUnitId 的字符串

标签: android admob adview


【解决方案1】:

loadAd() 方法在 loadAd 发生时检查 (mAdView.getAdSize() == null || mAdView.getAdUnitId() == null) 是否。

在调用 loadAd 以确定其状态之前,尝试记录 (mAdView.getAdSize() == null || mAdView.getAdUnitId() == null) 的布尔输出:

    mAdView = new AdView(this);
    mAdView.setAdSize(AdSize.BANNER);
    mAdView.setAdUnitId(AD_UNIT_ID);
    AdRequest adRequest = new AdRequest.Builder()
        .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
        .build();
    if(mAdView.getAdSize() != null || mAdView.getAdUnitId() != null)
    mAdView.loadAd(adRequest);
   // else Log state of adsize/adunit
((LinearLayout)findViewById(R.id.adView)).addView(mAdview);

【讨论】:

  • 如果我有ConstraintLayout,如何将AdView添加到ConstraintLayout?
  • 我解决了。 ConstraintLayout 的解决方案放在下面
【解决方案2】:

如果您在这里使用ConstraintLayoutCoordinatorLayout 解决方案

对于ConstraintLayout

private AdView mAdView;
private AdRequest mAdRequest;

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

    addAdView();
    initAd();
}

private void addAdView() {
    ConstraintLayout constraintLayout = findViewById(R.id.constraint_layout);
    ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.clone(constraintLayout);

    mAdView = new AdView(this);
    mAdView.setAdSize(AdSize.BANNER);
    mAdView.setAdUnitId(getString(R.string.banner1_id));

    mAdView.setId(View.generateViewId());
    constraintLayout.addView(mAdView);
    constraintSet.connect(mAdView.getId(), ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0);
    constraintSet.connect(mAdView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 0);
    constraintSet.connect(mAdView.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 0);
    constraintSet.constrainHeight(mAdView.getId(), ConstraintSet.WRAP_CONTENT);
    constraintSet.constrainWidth(mAdView.getId(), ConstraintSet.WRAP_CONTENT);
    constraintSet.applyTo(constraintLayout);

}

private void initAd() {
    MobileAds.initialize(this, initializationStatus -> {
    });

    initBanner();

}

private void initBanner() {
    mAdRequest = new AdRequest.Builder().build();
    mAdView.loadAd(mAdRequest);
    mAdView.setAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(LoadAdError loadAdError) {
            super.onAdFailedToLoad(loadAdError);

        }

        @Override
        public void onAdOpened() {
            super.onAdOpened();

        }
    });
}

对于CoordinatorLayout

private AdView mAdView;
private AdRequest mAdRequest;

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

    addAdView();
    initAd();
}

private void addAdView() {
    CoordinatorLayout coordinatorLayout = findViewById(R.id.coordinator_layout);

    mAdView = new AdView(this);
    mAdView.setAdSize(AdSize.BANNER);
    mAdView.setAdUnitId(getString(R.string.banner1_id));

    CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    params.gravity = Gravity.CENTER | Gravity.BOTTOM;
    mAdView.setLayoutParams(params);

    mAdView.setId(View.generateViewId());

    coordinatorLayout.addView(mAdView);

}

private void initAd() {
    MobileAds.initialize(this, initializationStatus -> {
    });

    initBanner();

}

private void initBanner() {
    mAdRequest = new AdRequest.Builder().build();
    mAdView.loadAd(mAdRequest);
    mAdView.setAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(LoadAdError loadAdError) {
            super.onAdFailedToLoad(loadAdError);

        }

        @Override
        public void onAdOpened() {
            super.onAdOpened();

        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    相关资源
    最近更新 更多