在Android上使用Admob - 当活动恢复时,状态栏区域未被覆盖

4
我遇到了一个非常麻烦的问题,尝试在我的应用程序中实现Admob。一开始我以为问题出在我的代码上,但经过一些调查,我发现这个问题也存在于Android-Banner-Essentials示例中(可以在这里下载)。 我想知道是否有人遇到过这个问题或者知道如何解决它。 基本上,当应用程序同时禁用状态栏和标题栏时,它应该使用全屏。Banner Essentials示例仅在可用区域的顶部显示Admob横幅。 我下载了示例,只更改了两件事: 1.添加了我的发布者ID以正确编译并接收任何广告;) 2.向活动清单添加一个参数以禁用标题和状态栏:android:theme =“@ android:style / Theme.NoTitleBar.Fullscreen” 编译二进制文件后,不管在哪个设备上启动它(尝试过Nexus One,G1,Desire,不同的Android版本),都会受到相同的影响: 1.当广告横幅显示时按Home键, 2.返回主屏幕后按住Home键以查看最近启动的应用程序, 3.选择回到Banner Essentials应用程序。

我的测试表明,当Admob横幅广告有50%的重现几率时,它不会回到屏幕顶部的位置。 为了更好地说明我的意思,我准备了三张截图:

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

重要通知:

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

我的应用程序比Banner Essentials更复杂,因此我开始在我的代码中搜索问题,但没有找到解决方法,因此尝试尽可能简化情况,以下是结果。

是否有人知道可能导致问题的原因?也许必须设置一些附加标志或属性来处理此行为?


嗨!你解决了这个问题,或者至少找到了它的原因吗?(我刚刚遇到了它...) - vmatyi
2个回答

4

这个问题被称为Android bug。目前没有解决方案,只有一个变通方法。 在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); 

  ...

}

虽然不是最好的选择,但它仍然是目前最佳的选择。更多信息请点击此处


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.
     */
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接