Admob на Android: пространство баннера не зарезервировано перед загрузкой - PullRequest
0 голосов
/ 06 ноября 2018

Мы используем AdMob в нашем приложении для Android уже более 4 лет. В последние дни мы столкнулись с проблемой в AdMob без изменения кода.

Как видно из рисунка ниже:

  • ПРЕДЫДУЩАЯ, пространство баннера было зарезервировано до загрузки баннера
  • СЕЙЧАС пространство баннера не зарезервировано перед загрузкой, что очень раздражает пользователя, который видит, как контент смещается вниз после загрузки баннера

enter image description here

===

Вот описание нашей реализации:

мы размещаем наш баннер на 20% верхней части экрана фрагмента внутри LinearLayout "banner_container"

<LinearLayout 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/banner_container"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
....
</LinearLayout>

на фрагменте onCreateView мы добавляем баннер в контейнер

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

...

adView = new AdView(getActivity()); 
adView.setAdSize(AdSize.SMART_BANNER);
adView.setAdUnitId(AD_UNIT_ID);

LinearLayout mBannerContainer = rootView.findViewById(R.id.banner_container); 
mBannerContainer.setVisibility(View.VISIBLE); 
mBannerContainer.addView(adView);

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

adView.loadAd(adRequest);

...

}

===

Как мы можем вернуться к ситуации, когда пространство баннера уже зарезервировано при загрузке?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Просто чтобы повторить комментарий и уточнить с помощью кодового блока, было проще всего сделать это:

LinearLayout layout = (LinearLayout) findViewById(R.id.mainLayout); layout.addView(adView, 0); adView.getLayoutParams().height = AdSize.SMART_BANNER.getHeightInPixels(this);

Мне бы очень хотелось, чтобы Admob был проинформирован об этом изменении в поведении при загрузке рекламы, чтобы разработчики знали об этом и могли избежать случайных кликов.

0 голосов
/ 21 ноября 2018

Поскольку Admob не резервирует высоту баннера перед загрузкой, похоже, решение заключается в том, чтобы сделать это вручную.

Согласно руководству Admob для баннерной рекламы:

Смарт-баннеры - это рекламные блоки, которые будут отображать рекламные баннеры на весь экран на любом экране на разных устройствах в любой ориентации. Смарт-баннеры помогают справляться с растущей фрагментацией экрана на разных устройствах, «умно» определяя ширину телефона в его текущей ориентации и заставляя рекламу просматривать этот размер.

Доступны три высоты рекламы (в dp, независимый от плотности пиксель):

32 - используется, когда высота экрана устройства меньше 400 50 - используется, когда высота экрана устройства составляет от 400 до 720 90 - используется, когда высота экрана устройства превышает 720

Решение 1

Вы знаете высоту, используя метод ниже:

    public static int getAdViewHeightInDP(Activity activity) {
         int adHeight = 0;

         int screenHeightInDP = getScreenHeightInDP(activity);
         if (screenHeightInDP < 400)
             adHeight = 32;
         else if (screenHeightInDP >= 400 && screenHeightInDP <= 720)
             adHeight = 50;
         else
             adHeight = 90;

         return adHeight;
     }


     public static int getScreenHeightInDP(Activity activity) {
         DisplayMetrics displayMetrics = ((Context) activity).getResources().getDisplayMetrics();

         float screenHeightInDP = displayMetrics.heightPixels / displayMetrics.density;

         return Math.round(screenHeightInDP);
     }

В вашем "banner_container" удалите:

android:visibility="gone"

Изменить фрагмент "onCreateView":

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

         ...

         adView = new AdView(getActivity()); 
         adView.setAdSize(AdSize.SMART_BANNER);
         adView.setAdUnitId(AD_UNIT_ID);

         LinearLayout mBannerContainer = rootView.findViewById(R.id.banner_container); 
         mBannerContainer.setLayoutParams(
              new LinearLayout.LayoutParams(
                            ViewGroup.LayoutParams.MATCH_PARENT,
                            getAdViewHeightInDP(this.getActivity())
               ));
         )
         mBannerContainer.addView(adView);

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

         adView.loadAd(adRequest);

         ...

     }

Решение 2

Вместо использования методов "getAdViewHeightInDP" и "getScreenHeightInDP" используется метод "AdSize.SMART_BANNER.getHeightInPixels (this)".

В вашем "banner_container" удалите:

android:visibility="gone"

Изменить фрагмент "onCreateView":

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

         ...

         adView = new AdView(getActivity()); 
         adView.setAdSize(AdSize.SMART_BANNER);
         adView.setAdUnitId(AD_UNIT_ID);

         LinearLayout mBannerContainer = rootView.findViewById(R.id.banner_container); 
         mBannerContainer.setLayoutParams(
              new LinearLayout.LayoutParams(
                            ViewGroup.LayoutParams.MATCH_PARENT,
                            AdSize.SMART_BANNER.getHeightInPixels(this.getActivity())
               ));
         )
         mBannerContainer.addView(adView);

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

         adView.loadAd(adRequest);

         ...

     }
...