为什么我们使用ViewTreeObserver#addOnGlobalLayoutListener()

我们为什么使用,请任何人都可以解释一下?ViewTreeObserver

在下面的代码中是对象。通过这整个代码,我理解“这是根据条件隐藏一些文本”,但唯一的问题是我们为什么要使用?creditsViewTextViewViewTreeObserver

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);
            }
        }
    });

答案 1

如果你没有使用,那么会简单地返回0px,因为它还没有布局(参见getWidth()getHeight()视图返回0)。ViewTreeObservermainLayout.getRootView().getHeight()

因此,您正在等待,直到视图被测量,布局,然后从中获取宽度/高度值。此回调将恰好在视图将在屏幕上布局时触发。


答案 2

不知道为什么,但这是我搜索KOTLIN时显示给我的第一页,在通过Lamda之后,我无法删除listner。

这就是我在kotlin中所做的

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()
        }
    })

Kool在kotlin(可重用)中执行此操作的方式创建这样的扩展

fun ViewGroup.addViewObserver(function: () -> Unit) {
    val view = this
    view.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            view.viewTreeObserver.removeOnGlobalLayoutListener(this)
            function.invoke()
        }
    })
}

并从这样的活动中使用它

listThumb.addViewObserver {
 // your code
}

listThumb 是 recyclerview,在本例中


推荐