Почему мы используем ViewTreeObserver#addOnGlobalLayoutListener()

Почему мы используем ViewTreeObserverПожалуйста, кто-нибудь может объяснить это?

В приведенном ниже коде creditsView является TextView объект. Под всем этим кодом я понимаю, что "это скрытие некоторого текста на основе условия", но единственное, почему мы используем ViewTreeObserver?

mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int heightDiff = mainLayout.getRootView().getHeight() - mainLayout.getHeight();

            if (heightDiff > 100) {
                Utils.appLogger("MyActivity", "keyboard opened");
                creditsView.setVisibility(View.GONE);
            }

            if (heightDiff < 100) {
                Utils.appLogger("MyActivity", "keyboard closed");
                creditsView.setVisibility(View.VISIBLE);
            }
        }
    });

2 ответа

Решение

Если бы вы не использовали ViewTreeObserver, чем mainLayout.getRootView().getHeight() просто вернет 0px, потому что он еще не выложен (см. getWidth() а также getHeight() из View возвращает 0).

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

Вниз знаю, почему, но это была первая страница, показанная мне, когда я искал KOTLIN и после прохождения Lamda я не смог удалить listner.

Вот как я это сделал в Котлине

tvLoginWith.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)
        override fun onGlobalLayout() {
            tvLoginWith.viewTreeObserver.removeOnGlobalLayoutListener(this)
            tvLogin.layoutParams.width = tvLoginWith.width
            tvLogin.requestLayout()
        }
    })
Другие вопросы по тегам