Почему мы используем 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()
}
})