【问题标题】:android.view.WindowLeaked: Activity has leaked window android.widget.ZoomButtonsController$Container that was originally added hereandroid.view.WindowLeaked: Activity 已经泄露了原来在这里添加的窗口 android.widget.ZoomButtonsController$Container
【发布时间】:2015-01-31 00:05:15
【问题描述】:

使用地图我有一个活动,它在没有可用连接时启动并使用离线地图 (MapQuest)。活动运行良好,显示地图,以及所有叠加层、标记等。当用户单击其中一个标记信息窗口时,另一个活动被启动,此时我在日志中收到一堆红色错误消息,尽管应用程序没有崩溃。这些消息(init 在标题中)似乎在谈论 ZoomButtons 和触摸事件。至于代码中的 ZoomButtons 或触摸事件(多点触控),只有 2 行:

map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);

而不是任何对话框......

  • 如果我写:

    map.setBuiltInZoomControls(false); map.setMultiTouchControls(false);

红色的错误信息消失了,但用户当然不能以任何方式放大或缩小……

由于错误(使用“true”参数)仅在启动另一个活动时发生,我认为我必须在 pause() 上添加一些东西,即:

onPause(){
map.setBuiltInZoomControls(false);
map.setMultiTouchControls(false);
super.OnPause();
}

---- 但是这样做并不会改变任何东西…… 有什么提示??? - 提前致谢!

【问题讨论】:

  • 我自己找到了答案(不是解决方案):当我单击标记并打开 infoWindow 时,出现 osmdroid zoomButtons(我猜他们必须有一些听众在地图上点击);如果我在它们始终存在时单击 infoWindow(以启动 2° 活动),则会发生错误;我等到它们消失:没有错误。所以我可能需要查看 osmdroid 源代码,看看是否可以更改 zoomButtons 出现/消失的行为,顺便说一句,这并不是真正有用的。
  • 多亏了你和诺丽,我才能处理好这个!谢谢!
  • 在此处的 osmdroid 问题跟踪器中记录:github.com/osmdroid/osmdroid/issues/328

标签: maps osmdroid


【解决方案1】:

将此添加到您的活动中:

@Override
public void finish() {
    ViewGroup view = (ViewGroup) getWindow().getDecorView();
    view.removeAllViews();
    super.finish();
}

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题...感谢您指出它是由(可能)当缩放控件仍然可见时引起的。我测试了它,这是正确的。当我按下后退按钮并显示缩放控件时,它会显示泄漏错误,如果我等到控件消失(它们在您停止滚动后消失),那么就没有泄漏错误。

    WebSettings 中的一项小研究提供了一种不显示缩放控件的方法,这意味着它不会在您想要按下后退按钮的任何时候泄漏。不过,它仍然会使用捏合效果进行缩放。使用此方法的唯一缺点是您的控件不会显示。但对我来说,这是值得的,因为大多数用户都知道所有应用都可以缩放。

    这是我使用的:

    // make sure your pinch zoom is enabled
     webView.getSettings().setBuiltInZoomControls(true);
    
    // don't show the zoom controls
     webView.getSettings().setDisplayZoomControls(false);
    

    【讨论】:

    • 是否有去除泄漏按钮的解决方案?它们通常留在那里,因为开发人员认为它们很有用......
    【解决方案3】:

    Android 3.0以下版本不会出现这个泄漏窗口的问题,可以尝试做:

        // enabled zoom support
        getSettings().setSupportZoom(true);
        getSettings().setBuiltInZoomControls(true);
    
        // but,We should hide this button, otherwise in the version
        // of Android 3 and above, there is a window leak.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // call requies API Level 11 ( Android 3.0 + )
            getSettings().setDisplayZoomControls(false);
        }
    

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多