neworld
neworld

Reputation: 7793

Why does getWidth() is larger than getLayoutParams().width sometimes?

My code for fixing ImageView:

private void fixImageWidth() {
    int parentHeight = getHeight();
    if (parentHeight == 0 || getParent() == null)
        return;

    Drawable drawable = image.getDrawable();
    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) image.getLayoutParams();
    if (drawable != null) {
        int height = drawable.getIntrinsicHeight();
        int width = drawable.getIntrinsicWidth();
        lp.width = (int) ((float)(parentHeight - lp.topMargin * 2) / height * width);
    } else {
        lp.width = LayoutParams.WRAP_CONTENT;
    }

    image.requestLayout();
}

But sometimes actually image bounds is not changed. Below you could see HierarchyViewer properties of that object:

HierarchyView properties

EDIT:

After I lot for debugging I determined, sometimes requestLayout don't remeasure image view. How does this happens?

EDIT:

I found solution, but still don't know reason. Solution is below:

    image.post(new Runnable() {
        @Override
        public void run() {
            image.requestLayout();
        }
    });

Any ideas?

Upvotes: 0

Views: 1223

Answers (1)

Daniel S. Fowler
Daniel S. Fowler

Reputation: 2033

Because getWidth() and getLayoutParams().width are different things. 1st relates to the View, the second is a layout request to the parent. If the parent cannot match the request the View maybe laid out with a different width. In this case you have requested MATCH_PARENT in the layout height and since an ImageView has a default scaleType of FIT_CENTER therefore content aspect ratio is maintained so the width will change.

Upvotes: 2

Related Questions