Kotlin匿名课这个

时间:2017-11-22 10:24:10

标签: android kotlin

我正在使用此问题中的示例代码(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

1 个答案:

答案 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)
    }
})