4

我在尝试在我的应用程序中实现 Admob 时遇到了非常讨厌的错误。我认为问题出在我的代码中,但经过一番调查后,我发现它也出现在 Android-Banner-Essentials 示例中(可在此处下载)。我想知道是否有人遇到过这个问题,或者可能知道如何处理它。

基本上,当应用程序同时禁用状态和标题栏时,它应该使用全屏。Banner Essentials 示例仅在可用区域的最顶部显示 Admob 横幅。我下载了这个例子,只改变了两件事:

  • 添加了我的发布商 ID 以正确编译并接收任何广告;)
  • 向活动的清单添加了一个参数以禁用标题和状态栏: android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

编译后的二进制文件,无论在什么设备上启动(尝试过 Nexus One、G1、Desire、不同的 Android 版本),都会受到相同问题的影响:

  • 显示广告横幅时,按主页,
  • 回到主屏幕后,按住主屏幕可查看最近启动的应用程序,
  • 选择回 Banner Essentials 应用程序。

我的测试表明,50% 的复制机会 Admob 横幅不会回到它的位置 - 屏幕的最顶部。为了更好地表达我的意思,我准备了三个屏幕截图:

http://img841.imageshack.us/g/correctz.png/

重要通知:

  • 当应用程序正常恢复时,banner 会显示在状态栏的正下方,并向上滑动直到与屏幕顶部边框对齐,
  • 当出现错误时,横幅根本不动,
  • 我无法通过任何其他中断(按返回、电源按钮)重现该问题,
  • 我认为它可能以某种方式与获得/失去焦点有关(见截图)。

我的应用程序比 Banner Essentials 复杂一些,所以我开始在我的代码中搜索问题,但没有运气,因此试图尽可能简化情况,结果如下。

有谁知道可能导致问题的原因?也许必须设置一些额外的标志或属性来处理这种行为?

4

2 回答 2

4

这被称为 Android 错误。没有解决方案,只有一种解决方法。您必须在 onResume 大约 1 秒后重新设置 Window Fullscreen (等待状态栏完成其精美的滑出动画......),这将导致它重新/计算整个布局,“解决”问题(使用快速跳转到正确的位置)。

public void onResume()
{

  ...

    handler.postDelayed(new Runnable() {
        public void run() {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
    }, 1500); 

  ...

}

这样不好。但它仍然是最好的。更多信息在这里

于 2011-09-20T13:47:07.657 回答
0

在我的情况下,这种行为是由从锁定屏幕恢复触发的。不知道为什么,但是在添加了空的重载函数后它被修复了(但我只在我的 HTC Wilfire 上测试了它)。你可能是一个不同的错误。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    /* Workaround a probable Android bug with fullscreen activities:
     * on resume status bar hides and black margin stays, 
     * reproducible half of the time when coming back from lock screen 
     * (tested on HTC Wildfire)
     * No idea why but this empty overload method fixed it.
     */
}
于 2011-12-20T23:54:41.973 回答