Kotlin anonymous class this



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

相关内容

最新更新