我正在使用此问题中的示例代码(getWidth() and getHeight() of View returns 0)。
它有以下代码,
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
view.getHeight(); //height is ready
}
});
我在Kotlin这样写了
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
?
答案 0 :(得分:1)
问题在于Kotlin asumming removeOnGlobalLayoutListener
需要SAM expression。然后,当您传递{ this }
时,您只是创建另一个OnGlobalLayoutListener
实例,此处为等效项:
view.getViewTreeObserver().removeOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
YourOuterClass.this;
}
});
此侦听器在当前侦听器列表中不存在
为了解决这个问题,您必须将OnGlobalLayoutListener
声明为对象而不是lamba,这样您就可以引用正确的“ this ”并正确删除侦听器一旦被召唤。
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)
}
})