我在此问题中使用示例代码(getWidth()和视图的getheight()返回0)。
它具有以下代码,
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
view.getHeight(); //height is ready
}
});
我像这样在科特林写了
image_view.viewTreeObserver.addOnGlobalLayoutListener{
image_view.viewTreeObserver.removeOnGlobalLayoutListener { this }
Log.d("Should be called once", "Height = " + image_view.height + ", Width = " + image_view.width)
};
结果是,
11-22 19:18:33.319 4754-4754/loser.qrcode D/Should be called once: Height = 672, Width = 672
11-22 19:18:33.328 4754-4754/loser.qrcode D/Should be called once: Height = 672, Width = 672
所以,它被称为两次。也就是说,removeOnGlobalLayoutListener
不起作用。我应该使用什么代替this
?
这里的问题是Kotlin是removeOnGlobalLayoutListener
需要SAM表达式。然后,当您通过{ this }
时,您只是在创建另一个OnGlobalLayoutListener
实例,在这里等效:
view.getViewTreeObserver().removeOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
YourOuterClass.this;
}
});
,当前听众列表中不存在此听众
为了解决此问题,您必须将OnGlobalLayoutListener
声明为对象而不是lamba,因此您可以参考正确的" 此",并在调用后正确删除侦听器。
image_view.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
image_view.viewTreeObserver.removeOnGlobalLayoutListener(this)
Log.d("Should be called once", "Height = " + image_view.height + ", Width = " + image_view.width)
}
})