1

I am using the sample code in this question(getWidth() and getHeight() of View returns 0).

It had the following code,

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); view.getHeight(); //height is ready } }); 

And I wrote it in Kotlin like this

image_view.viewTreeObserver.addOnGlobalLayoutListener{ image_view.viewTreeObserver.removeOnGlobalLayoutListener { this } Log.d("Should be called once", "Height = " + image_view.height + ", Width = " + image_view.width) }; 

The result was,

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 

So, it was called twice. That is, removeOnGlobalLayoutListener did not work. What should I use instead of this?

1 Answer 1

1

The problem here is that Kotlin is asumming removeOnGlobalLayoutListener will need a SAM expression. Then when you are passing { this }, you are just creating another OnGlobalLayoutListenerinstance, here the equivalent:

view.getViewTreeObserver().removeOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { YourOuterClass.this; } }); 

And this listener doesn't exist in the current listeners list

In order to solve this, you have to declare your OnGlobalLayoutListener as an object and not as a lamba, like this you can reference the correct "this" and remove the listener properly once is called.

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) } }) 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.