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();
}
有帮助吗?

解决方案

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.

其他提示

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/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top