OS版本4.4(KitKat)和5(Lollipop)onVisibilityChanged侦听器未触发

时间:2018-11-10 09:16:08

标签: android view visibility

我已经在网上寻找答案,但没有找到此问题的根本原因。

我有一个带有视图的应用程序,它可以监听onVisibilityChangedonWindowVisibilityChanged。我注意到的是,在具有KitKat(API 19)或Lollipop(API 22)的Android设备上,当视图附加到主布局时,永远不会触发onVisibilityChanged,而只会触发onWindowVisibilityChanged。

我猜这个问题源于从KitKat到Lollipop的本机API更改,但是没有找到任何文档或参考。当我在棉花糖(API 23)上检查我的应用程序时,没有发生。

我只想知道这是一个已知问题,还是有某种方法可以解决此问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

看起来Android团队确实确实在Android 23-Marshmallow中改变了这种行为。如果您查看Android 23中View.java的源代码,可以看到他们在onVisibilityChanged内向dispatchAttachedToWindow添加了一个调用。

Here is the commit to AOSP where this change happened

Here is the diff for that change

鉴于您无法发布代码,我无法提供比将更改指向您更好的解决方案。

如果您尝试跟踪附加到窗口的视图,我建议使用onAttachedToWindow API。

请注意,在Android 23中调用onVisibilityChanged的方法很可能是dispatchAttachedToWindow。此方法也称为onAttachedToWindow,因此从理论上讲您可以侦听并手动检查可见性。

   // Override inside your custom view
   override fun onAttachedToWindow() {
        super.onAttachedToWindow()

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            // Check for visibility here, but note that onVisibilityChanged initially gets called with View.GONE
            // Unless the view is inside of a ViewGroup. See the source code for ViewRootImpl.java for more details.
        }
    }

否则,您需要对Android 22及以下版本的逻辑进行特殊处理,以使您多听onWindowVisibilityChanged而不是onVisibilityChanged