Настройка размера объявления программно не работает для NativeAdExpress

Мой XML-код для объявления

 <com.google.android.gms.ads.NativeExpressAdView
    android:id="@+id/adView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:adUnitId="YOUR_AD_ID"/>

Я устанавливаю размер объявления программно, используя следующий код

mAdView = (NativeExpressAdView) cardView.findViewById(R.id.adView);
int width = screenwidth - 16;
mAdView.setAdSize(new AdSize(width, 250));
AdRequest request = new AdRequest.Builder()
   .addTestDevice("YOUR_DEVICE")
   .build();
mAdView.loadAd(request);

При запуске приложение вылетает с ошибкой

java.lang.IllegalStateException: размер объявления и идентификатор рекламного блока должны быть установлены до вызова loadAd.

Он отлично работает, когда я пытаюсь так

<com.google.android.gms.ads.NativeExpressAdView
    android:id="@+id/adView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:adUnitId="ca-app-pub-3940256099942544/1072772517"
    app:adSize="320x250"/>

Но я хочу установить ширину объявления динамически


person Salmon K P    schedule 23.02.2017    source источник
comment
Попробуйте включить xmlns:ads="http://schemas.android.com/apk/res-auto" в файл `xml'   -  person aldakur    schedule 23.02.2017


Ответы (2)


Это было решено, когда я добавил NativeExpressAdView программно и удалил из XML следующим образом.

mAdView = new NativeExpressAdView(this);
int width = screenwidth - 16;
mAdView.setAdSize(new AdSize(width, 250)); 
mAdView.setAdUnitId("myAdUnitId");

// Create an ad request.
AdRequest.Builder adRequestBuilder = new AdRequest.Builder();

// Optionally populate the ad request builder.
adRequestBuilder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);

// Add the NativeExpressAdView to the view hierarchy.
layout.addView(mAdView);

// Start loading the ad.
mAdView.loadAd(adRequestBuilder.build());
person Salmon K P    schedule 23.02.2017

Я устанавливаю размер объявления динамически, и он работает нормально. Ниже мой код.

private void setUpAndLoadNativeExpressAds() {
    // Use a Runnable to ensure that the RecyclerView has been laid out before setting the
    // ad size for the Native Express ad. This allows us to set the Native Express ad's
    // width to match the full width of the RecyclerView.
    mRecyclerView.post(new Runnable() {
        @Override
        public void run() {
            final float scale = MainActivity.this.getResources().getDisplayMetrics().density;
            // Set the ad size and ad unit ID for each Native Express ad in the items list.
            for (int i = 0; i <= mRecyclerViewItems.size(); i += ITEMS_PER_AD) {
                adView = (NativeExpressAdView) mRecyclerViewItems.get(i);
                final CardView cardView = (CardView) findViewById(R.id.ad_card_view);
                final int adWidth = cardView.getWidth() - cardView.getPaddingLeft()
                        - cardView.getPaddingRight();
                AdSize adSize = new AdSize((int) (adWidth / scale), NATIVE_EXPRESS_AD_HEIGHT);
                adView.setAdSize(adSize);
                adView.setAdUnitId(AD_UNIT_ID);
            }
            adView.loadAd(new AdRequest.Builder().build());
         }
    });
}

Возможно, вам нужно установить идентификатор объекта добавления перед загрузкой добавлений.

Надеюсь, что это поможет вам.

person Foram Shah    schedule 23.02.2017
comment
Раньше я добавлял идентификатор рекламного блока в xml. Когда я добавил то же самое программно, сбой был исправлен, но появилась ошибка, говорящая о том, что Необходимый XML-атрибут adSize отсутствует. - person Salmon K P; 23.02.2017