'Why does calling getWidth() on a View in onResume() return 0?

Everything I've read says you can't call getWidth() or getHeight() on a View in a constructor, but I'm calling them in onResume(). Shouldn't the screen's layout have been drawn by then?

@Override
protected void onResume() {
    super.onResume();

    populateData();
}

private void populateData() {
    LinearLayout test = (LinearLayout) findViewById(R.id.myview);
    double widthpx = test.getWidth();
}


Solution 1:[1]

you have to wait that the the current view's hierarchy is at least measured before getWidth and getHeigth return something != 0. What you could do is to retrieve the "root" layout and post a runnable. Inside the runnable you should be able to retrieve width and height successfully

root.post(new Runnable() {
     public void run() {
         LinearLayout test = (LinearLayout) findViewById(R.id.myview);
         double widthpx = test.getWidth();
     }
});

Solution 2:[2]

As previous answer stated - your view is not measured yet. Have a look at Android KTX - Kotlin extensions under Jetpack, especially this one:

View.doOnLayout((view: View) -> Unit)?)

This extension function makes sure that the provided action is executed once the VIew is laid out or, if it was already laid out, it will be called immediately.

https://developer.android.com/reference/kotlin/androidx/core/view/package-summary#(android.view.View).doOnLayout(kotlin.Function1)

This article explains in detail how Views are measured, laid and drawn and what you as developer can do to ensure you get correct size of your View. It also goes over usually recommended solutions like View.post() and registering OnGlobalLayoutListener and explains what can go wrong when using them.

https://cheesecakelabs.com/blog/understanding-android-views-dimensions-set/

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 Blackbelt
Solution 2 TheJudge