How to size an Android view based on its parent's dimensions

android, layout

Solution

I don't know if anyone is still reading this thread or not, but Jeff's solution will only get you halfway there (kinda literally). What his onMeasure will do is display half the image in half the parent. The problem is that calling super.onMeasure prior to the `setMeasuredDimension` will measure all the children in the view based on the original size, then just cut the view in half when the `setMeasuredDimension` resizes it.

Instead, you need to call `setMeasuredDimension` (as required for an onMeasure override) and provide a new `LayoutParams` for your view, then call `super.onMeasure`. Remember, your `LayoutParams` are derived from your view's parent type, not your view's type.

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
   int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
   int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
   this.setMeasuredDimension(parentWidth/2, parentHeight);
   this.setLayoutParams(new *ParentLayoutType*.LayoutParams(parentWidth/2,parentHeight));
   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

I believe the only time you'll have problems with the parent `LayoutParams` is if the parent is an `AbsoluteLayout` (which is deprecated but still sometimes useful).

Problem

How can I size a view based on the size of its parent layout. For example I have a `RelativeLayout` that fills the full screen, and I want a child view, say an `ImageView`, to take up the whole height, and 1/2 the width? I've tried overriding all on `onMeasure`, `onLayout`, `onSizeChanged`, etc and I couldn't get it to work....

Original source

Related problems