AdView元素会在某些设备上创建空白区域吗?

时间:2014-02-16 14:59:24

标签: android android-layout admob

我在一个相对简单的布局中有一个AdView元素,根据用户是否启用了广告以及是否有任何广告可以显示/隐藏。

默认情况下隐藏包含AdView的RelativeLayout,并且仅在调用onAdLoaded()时向用户显示。如果用户已禁用广告,或者调用onAdFailedToLoad(),则RelativeLayout会重新隐藏(或者如果之前因某种原因显示,则会重新隐藏)。

这在大多数设备上运行良好,但对于少数设备(包括Samsung Galaxy Ace)存在问题。关闭广告一切都很好,但如果打开广告,AdView会占用适当的空间,但是完全空白(它不是黑色,只是完全不可见)。

这是布局文件的相关部分:

<RelativeLayout
        android:id="@+id/adContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:visibility="gone"
        style="@style/layout_row">

    <!-- AdView is inserted here -->

</RelativeLayout>

@style/layout_row只是在顶部添加一点边距,使其远离屏幕的顶部,但没有别的。

这是创建和插入广告的代码部分(在onResume()内部调用):

// hide advert by default
findViewById(R.id.adContainer).setVisibility(View.GONE);

// check if ads are turned on
if (prefs.getBoolean("show_ads", true)) {
    // create a new ad view
    AdView adView = new AdView(this);
    adView.setAdSize(AdSize.BANNER);
    adView.setAdUnitId("___ MY ID ___");

    // add it to the relative layout
    ((RelativeLayout) findViewById(R.id.adContainer)).addView(adView);

    // deal with the arrival of ads
    adView.setAdListener(new AdListener() {

        // hide ad block if none could be found
        @Override
        public void onAdFailedToLoad(int errorCode) {
            findViewById(R.id.adContainer).setVisibility(View.GONE);
            super.onAdFailedToLoad(errorCode);
        }

        // show ad block if one was found
        @Override
        public void onAdLoaded() {
            findViewById(R.id.adContainer).setVisibility(View.VISIBLE);
            super.onAdLoaded();
        }

    });

    // request ads
    AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) // Emulators
            .addTestDevice("8AFD3F7DD723DA9355EE3B35E8666475") // My Samsung S4 test device
            .build();
    adView.loadAd(adRequest);
} else {
    // hide the ad block
    findViewById(R.id.adContainer).setVisibility(View.GONE);
}

要重复,这在大多数设备上都能正常运行,包括将广告设置为测试模式的设备和不设置广告的设备。这个问题到目前为止只出现在Galaxy Ace上,但不幸的是我无法访问设备来读取logcat。

任何人都可以向我提出任何可能导致此问题的建议以及可以采取哪些措施来解决这个问题?

谢谢:)

更新:我在RelativeLayout上放了一个亮粉色的背景颜色,看看发生了什么,我发现在有问题的设备上,布局onAdLoaded(),但仍然没有显示广告。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

经过多次尝试各种解决方案后,我终于编写了一个方法,该方法占用Logcat的最后100行并提示用户对它们执行某些操作。在这种情况下,我要求三星Galaxy Ace的所有者通过电子邮件发送给我(她在数百英里外,所以我的笔记本电脑上的调试是不可能的)。

问题很简单,我几乎踢了自己。她的手机屏幕太小,无法展示广告。横幅尺寸为320 x 50dp,但她的屏幕宽度正好是320dp,而且我的应用在两侧都有7dp的填充,因此广告无法显示。

我有两个选择:检测屏幕尺寸并仅在设备上展示足够大的广告,或重新排列布局以确保广告获得全宽并避免边缘填充。我还没有决定采取哪条路线。

这揭示了我认为AdMob SDK中的一个主要缺陷:当由于尺寸问题而无法显示广告时,仍会调用onAdLoaded()。我认为除非加载和显示广告,否则不应调用此成功方法;如果空间很小,我认为应该调用onAdFailedToLoad()或其他一些失败方法。


最终,我选择了两者兼而有之。我重新安排了布局,以确保AdView可以在需要时拥有整个屏幕宽度,现在我也检查屏幕尺寸:

// hide advert by default
findViewById(R.id.adContainer).setVisibility(View.GONE);
// find the screen width
Display display = getWindowManager().getDefaultDisplay();
int width;
if (android.os.Build.VERSION.SDK_INT >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
} else {
    width = display.getWidth();
}
// show advert if they are enabled AND they will fit
if (prefs.getBoolean("show_ads", true) && width>=320) {
    // ads
} else {
    // no ads
}

理想的解决方案?并不是的。但它确实有效。