Question

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();
}
Was it helpful?

Solution

A view still hasn't been drawn when onResume() is called, so its width and height are 0. You can "catch" when its size changes using OnGlobalLayoutListener():

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {

        // Removing layout listener to avoid multiple calls
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            yourView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
        else {
            yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }

        populateData();
    }
});

For additional info take a look at Android get width returns 0.

OTHER TIPS

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();
     }
});

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/

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top