PopupWindow 无法在点击外部后自动消失的问题

  最近在 Android 5.x 上遇到了一个 PopupWindow 无法消失的问题,PopupWindow 已经设置了

但点击 PopupWindow 外部无法消除 PopupWindow。在 Android 6.0 上没有此问题。

  该问题的原因是在使用PopupWindow时,为了取消默认的带阴影效果,使用了

使用非 null 的 Background 即可解决此问题,如:

  查看 Android 5.1 版本中的 PopupWindow 可以看到,在 preparePopup() 阶段,会检查 mBackground 是否为 null,若不为 null,则会生成一个 PopupViewContainer:

  在同文件中可以找到 PopupViewContainer,它会在点击 PopupWindow 外部后调用 dismiss():

  由此可见,如果 PopupWindow 的 Background 为 null,没有 PopupViewContainer,PopupWindow 就不会在点击外部时自动消失。

  Android 6.0 的代码中,在 preparePopup() 中可以找到:

点击外部取消的逻辑放到了 PopupDecorView 中,也就是上面的 mDecorView,由 createDecorView() 创建,与 mBackground 是否为 null 无关。所以在 Android 6.0 上,即使 Background 为 null,PopupWindow 依旧可以正常消失。