【问题标题】:Admob on Android: banner space not reserved before loadingAndroid 上的 Admob:加载前未保留横幅空间
【发布时间】:2019-01-11 04:06:28
【问题描述】:

我们在 Android 应用上使用 AdMob 已有 4 年多了。 最近几天,我们在没有修改任何代码的情况下遇到了 AdMob 问题。

如下图所示:

  • 以前,横幅空间是在加载横幅之前保留的
  • 现在,横幅空间在加载前没有保留,这给用户带来了非常烦人的体验,他们在横幅加载后看到内容向下移动

===

这里是我们的实现的描述:

我们将横幅放置在片段屏幕顶部约 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>

在 Fragment 的“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);

...

}

===

我们如何才能恢复到加载时已经保留横幅空间的情况?

【问题讨论】:

  • 为什么在加载布局时使用可见性来“消失”。相反,你可以使用不可见的banner_container
  • 嗨@DharakBhatt,原因是高级用户默认为gone。但是,我只是尝试在 xml 布局中将其更改为 visible,但同样的情况发生了(考虑在 onCreateView 中将其设置为 visibile)。我认为这取决于layout_height,即wrap_content。出于某种原因,以前 AdMob 甚至在横幅加载之前就设置了横幅的高度,而现在则没有。
  • @DanieleB 你有没有想过这件事?这导致我因意外点击而受到处罚。
  • 嗨@Steve M,除了手动预设线性布局的高度外,我找不到解决方案

标签: android admob fragment android-linearlayout


【解决方案1】:

由于 Admob 在加载之前没有保留横幅高度,所以解决方案似乎是手动完成。

根据Admob guide for Banner Ads:

智能横幅是一种广告单元,可以在任何屏幕尺寸上以任一方向在不同设备上呈现全屏横幅广告。智能横幅通过“智能”检测手机在当前方向上的宽度,并使广告视图具有该尺寸,从而帮助处理不同设备上日益增加的屏幕碎片。

提供三种广告高度(以 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);

         ...

     }

【讨论】:

  • 谢谢!这有帮助,但我认为方法 2 更准确。 LayoutParams 高度应该是一个以像素为单位的整数。但是 Google 规范中的 2、50 和 90 是 dp 而不是像素。因此,您需要将 getAdViewHeightInDP 的结果转换为像素。最后我发现直接将我的 adView 的高度设置为 adView.getLayoutParams().height = AdSize.SMART_BANNER.getHeightInPixels(this);
  • 解决方案 2 有效。它节省了我的时间。我不明白为什么 Google 会留下会导致很多问题的当前行为。
  • 谢谢,解决方案 2 有效。这种行为变化会导致应用的行为违反 Google 政策。如果没有解决方案 2,广告会移动或隐藏内容,可能会导致用户意外点击广告。
【解决方案2】:

只是从评论中重申并用代码块澄清,这样做是最简单的:

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

我真的希望 Admob 了解广告加载行为的这一变化,以便开发人员了解并避免意外点击。

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多