'Android: method called after creation of activity interface

I would like to perform some task after the creation of the graphic interface of the activity. I need to know the exact height and width of some views and change the layoutParams of some of those views based on the width and height. In the onResume method the views have all the parameters still equal to 0...

As for now I'm using a delayed task that runs after some time from the onCreate but this isn't a good solution at all...

What is the last method called in the activity creation? And are the views' width and height available in such method?



Solution 1:[1]

Call this inside of the onCreate()

       final View rootView = getWindow().getDecorView().getRootView();
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {

                    @Override
                    public void onGlobalLayout() {

                        //by now all views will be displayed with correct values

                    }
                });

Solution 2:[2]

onResume() is last, but perhaps better is onViewCreated(). Its advantage is that it is not invoked every time you regain focus. But try getting properties of your view inside of post() over layout element which you need. For example:

        textView.post(new Runnable() {
            @Override
            public void run() {
                 // do something with textView
            }
        });

Solution 3:[3]

The last method that runs when activity starts is onResume(). You can find it at Activity lifecycle.

If that is not good enough for you, run delayed task from this onResume() and you'll be fine.

Solution 4:[4]

In the last line of the onResume() method get all the data you want. It should show you all that you need.

Solution 5:[5]

Use a Coroutine:

In onCreate() ...

CoroutineScope(SupervisorJob()).launch {
  getImageAttributes()
}

... then use a while loop to wait until image is in View ...

private fun getImageAttributes() {
  while (imageView.height == 0) { /* */ }
  val h = imageView.height
  val w = imageView.width
  val b = imageView.clipBounds
  val x = imageView.x
  val y = imageView.y
  val tx = imageView.translationX
  val ty = imageView.translationY
}

You should add a timeout or make the Job cancellable if there is a chance that the imageView.height is going to be 0.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 A. Adam
Solution 2
Solution 3 Yaniv
Solution 4 Hitman
Solution 5 Kent