Версии ОС 4.4 (KitKat) и 5 ​​(Lollipop) на VisibleChanged Listener не запускаются - PullRequest
0 голосов
/ 10 ноября 2018

Я искал в Интернете ответ на этот вопрос, но не нашел основную причину этой проблемы.

У меня есть приложение с представлением, которое прослушивает onVisibilityChanged и onWindowVisibilityChanged . Я заметил, что на устройствах Android с KitKat (API 19) или Lollipop (API 22), когда представление присоединяется к основному макету, onVisibilityChanged никогда не запускается, только onWindowVisibilityChanged.

Я предполагаю, что эта проблема возникает из-за изменения собственного API, которое произошло с KitKat до Lollipop, но не нашло никакой документации или ссылки на это. Когда я проверил свое приложение на «Зефир» (API 23), этого не произошло.

Я просто хотел бы знать, если это известная проблема или есть какой-то способ исправить это поведение.

Спасибо.

1 Ответ

0 голосов
/ 05 декабря 2018

Похоже, что команда Android действительно изменила это поведение в Android 23 - Marshmallow. Если вы посмотрите на исходный код View.java в Android 23, вы увидите, что они добавили вызов onVisibilityChanged внутри dispatchAttachedToWindow.

Вот коммит к AOSP, где произошло это изменение .

Вот разница для этого изменения .

Учитывая, что вы не можете опубликовать свой код, я не могу предложить лучшего решения, чем указать вам на изменение.

Если вы пытаетесь отслеживать прикрепления вида к окну, я бы предложил onAttachedToWindow API.

Обратите внимание, что метод, который вызывает onVisibilityChanged в Android 23, скорее всего, 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 more вместо onVisibilityChanged.

...