Android上的Admob:加载前未保留标题空间

Android上的Admob:加载前未保留标题空间,android,admob,fragment,android-linearlayout,Android,Admob,Fragment,Android Linearlayout,我们在Android应用程序上使用AdMob已经超过4年了。 在过去的几天里,我们在没有修改任何代码的情况下遇到了AdMob的问题 如下图所示: 以前,在加载条幅之前,条幅空间是保留的 现在,在加载之前没有保留标题空间,这给用户带来了一种非常烦人的体验,用户在加载标题后看到内容向下移动 === 以下是我们的实施说明: 我们将横幅放置在片段屏幕上方约20%的位置,在线性布局的“横幅容器”中 === 我们如何才能恢复到加载时已保留横幅空间的情况?由于Admob在加载之前没有保留横幅高度,因此解

我们在Android应用程序上使用AdMob已经超过4年了。 在过去的几天里,我们在没有修改任何代码的情况下遇到了AdMob的问题

如下图所示:

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

===

以下是我们的实施说明:

我们将横幅放置在片段屏幕上方约20%的位置,在线性布局的“横幅容器”中

===


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

由于Admob在加载之前没有保留横幅高度,因此解决方案似乎是手动执行

根据

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

有三种ad高度(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);
     }
更改片段“onCreateView”:

解决方案2

使用方法“AdSize.SMART_BANNER.getHeightInPixels(this)”而不是使用方法“getAdViewHeightInDP”和“getScreenHeightInDP”

在您的“横幅容器”中删除:

更改片段“onCreateView”:


仅从评论中重申并用代码块澄清,最简单的方法是:

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


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

为什么在加载版面时使用“gone”的可见性。相反,你可以在banner_containerHi@DharakBhatt中使用不可见,原因是对于高级用户,它默认为
gone
。但是,我只是尝试在xml布局中将其更改为
visible
,但同样的情况也发生了(请考虑在onCreateView中将其设置为
visible
)。我认为这取决于
布局高度
,即
包装内容
。出于某种原因,以前AdMob甚至在装入横幅之前就已经设置了横幅的高度,现在没有设置。@DanieleB你对此有什么发现吗?这导致我因意外点击而受到处罚。嗨@Steve M,除了手动预设线性布局的高度外,我找不到解决方案!这有帮助,但我认为方法2更准确。LayoutParams高度应为整数(以像素为单位)。但谷歌规格的2、50和90都不是像素。因此,您需要将getAdViewHeightInDP的结果转换为像素。最后,我发现直接将adView的高度设置为adView.getLayoutParams().height=AdSize.SMART_BANNER.getHeightInPixels是最容易的;解决方案2奏效了。这节省了我的时间。我不明白谷歌为什么会放弃当前的行为,这将导致很多问题。谢谢,解决方案2成功了。这种行为的改变导致应用程序的行为违反了谷歌的政策。如果没有解决方案2,广告将移动或隐藏内容,用户可能会意外点击广告。
@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);

...

}
    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);
     }
android:visibility="gone"
    @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);

         ...

     }
android:visibility="gone"
    @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);

         ...

     }