How can I set an ImageView
's width and height programmatically?

- 482
- 1
- 6
- 22

- 10,549
- 14
- 61
- 83
-
20Footnote for anyone struggling with this coming from another platform. the **"size and shape to fit"** option is handled beautifully in Android; but it's hard to find. you typically want width match parent, height wrap content, **adjustViewBounds turned on**, scale **fitToCenter** and cropToPadding **false**. then it's automatic. I really hope it helps someone! – Fattie May 21 '14 at 07:38
15 Answers
It may be too late but for the sake of others who have the same problem, to set the height of the ImageView
:
imageView.getLayoutParams().height = 20;
Important. If you're setting the height after the layout has already been 'laid out', make sure you also call:
imageView.requestLayout();

- 16,643
- 4
- 81
- 106

- 14,061
- 1
- 23
- 25
-
113If you're setting the height after the layout has already been 'laid out', make sure you call image_view.requestLayout() – Rhys Davis Aug 06 '13 at 16:10
-
1
-
12
-
@FranciscoCorralesMorales use the static values defined for LayoutParams – andrea.rinaldi Mar 25 '15 at 09:53
-
13@FranciscoCorralesMorales use this for wrap_content `image_view.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT` .. If the view parent is `LinearLayout` replace the `RelativeLayout` with it – Sami Eltamawy May 05 '15 at 08:50
-
do i need to requestLayout first or after layout has been 'laid out'? and is sample height 20 in dips or pixels? – Lendl Leyba Aug 25 '15 at 07:11
-
-
46So, how to specify the **unit**? How to say that it's **dp**, not **sp**, etc. – Saeed Neamati Sep 03 '15 at 09:37
-
6@SaeedNeamati, it's **px**. In order to convert dp to px use methods, for instance, in http://stackoverflow.com/questions/4605527/converting-pixels-to-dp. – CoolMind Aug 10 '16 at 13:54
-
1Future readers, use [this](https://stackoverflow.com/a/36340513/812919) if creating the view programmatically. – olfek Jun 21 '18 at 20:41
-
@SaeedNeamati choose it on your own when pass size. For example: `val dp = 30; TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().displayMetrics)` – ardiien Mar 31 '20 at 12:30
If your image view is dynamic, the answer containing getLayout will fail with null-exception.
In that case the correct way is:
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100, 100);
iv.setLayoutParams(layoutParams);

- 3,231
- 1
- 16
- 6
-
7if I put that code my image disappears. why? ImageView imgLogo = new ImageView(this); imgLogo.setImageDrawable(logo); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(32,32); imgLogo.setLayoutParams(layoutParams); row.addView(imgLogo); – Mustafa Güven May 27 '12 at 22:40
-
3Thanks for this answer, put me on the right track. As an added note, LinearLayout should be set to the parent view type of the image. For example, if your image view is in a gallery, you should use the Gallery layout parameters instead of LinearLayout or you will have casting exceptions. – profexorgeek Jun 01 '12 at 18:34
-
3@MustafaGüven I had the same problem as you, where my `ImageView` disappears. The trick is to make the layout part (i.e., `
.LayoutParams`) be the same as what the parent of the `ImageView` is. So, for example, if you've placed your `ImageView` within a `TableRow` within a `TableLayout`, you should have it as `TableRow.LayoutParams`. – user2323030 Dec 03 '14 at 05:35 -
to elaborate on user($some_number) -> you need to _create_ the LayoutParams according the parent and _set_ them on the child (the imageView) , also requestLayout() doesn't seem to be necessary at time of writing – SanThee Jun 24 '17 at 00:47
-
lol you create new params, bad answer, you just can get the current ones, I mean if you do it (create new ones) then you don't even need xml, then also create/add imageview programmatically... – user924 Mar 10 '18 at 01:38
This simple way to do your task:
setContentView(R.id.main);
ImageView iv = (ImageView) findViewById(R.id.left);
int width = 60;
int height = 60;
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height);
iv.setLayoutParams(parms);
and another way if you want to give screen size in height and width then use below code :
setContentView(R.id.main);
Display display = getWindowManager().getDefaultDisplay();
ImageView iv = (LinearLayout) findViewById(R.id.left);
int width = display.getWidth(); // ((display.getWidth()*20)/100)
int height = display.getHeight();// ((display.getHeight()*30)/100)
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height);
iv.setLayoutParams(parms);
hope use full to you.

- 49
- 5

- 37,851
- 12
- 116
- 113
-
This is Fine Work for me !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Display display = getWindowManager().getDefaultDisplay(); ImageView iv = (LinearLayout) findViewById(R.id.left); int width = display.getWidth(); // ((display.getWidth()*20)/100) int height = display.getHeight();// ((display.getHeight()*30)/100) LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height); iv.setLayoutParams(parms); – Selim Raza Apr 07 '19 at 11:47
-
Why do people declare `int` variables if they won't be re-used elsewhere? Seems unnecessary but I don't know much about it tbh. – n00dles May 11 '19 at 05:26
-
1
I have played this one with pixel
and dp
.
private int dimensionInPixel = 200;
How to set by pixel:
view.getLayoutParams().height = dimensionInPixel;
view.getLayoutParams().width = dimensionInPixel;
view.requestLayout();
How to set by dp:
int dimensionInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dimensionInPixel, getResources().getDisplayMetrics());
view.getLayoutParams().height = dimensionInDp;
view.getLayoutParams().width = dimensionInDp;
view.requestLayout();
Hope this would help you.

- 52,124
- 21
- 173
- 151
-
2How would I do this for a specific dp value (i.e. not converting from px to dp)? – alxcyl Nov 16 '16 at 05:08
-
1@Hiren what is mean by getResources().getDisplayMetrics() when I read the document ,it seem to be DisplayMetrics. Can you please explain me bit briefly. I am new to android ,thanks . – Srini Mar 30 '18 at 15:18
-
1Caused by: java.lang.NullPointerException: Attempt to write to field 'int android.view.ViewGroup$LayoutParams.height' on a null object reference – MohammedAli Sep 06 '18 at 12:09
If you need to set your width or height to match_parent
(as big as its parent) or wrap_content
(large enough to fit its own internal content), then ViewGroup.LayoutParams
has this two constants:
imageView.setLayoutParams(
new ViewGroup.LayoutParams(
// or ViewGroup.LayoutParams.WRAP_CONTENT
ViewGroup.LayoutParams.MATCH_PARENT,
// or ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.MATCH_PARENT ) );
Or you can set them like in Hakem Zaied's answer:
imageView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
//...
You can set value for all case.
demoImage.getLayoutParams().height = 150;
demoImage.getLayoutParams().width = 150;
demoImage.setScaleType(ImageView.ScaleType.FIT_XY);

- 3,707
- 11
- 35
- 54

- 139
- 1
- 3
-
4Caused by: java.lang.NullPointerException: Attempt to write to field 'int android.view.ViewGroup$LayoutParams.height' on a null object reference – MohammedAli Sep 06 '18 at 12:08
Simply create a LayoutParams object and assign it to your imageView
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(150, 150);
imageView.setLayoutParams(params);

- 2,760
- 13
- 30
The best and easiest way to set a button dynamically is
Button index=new Button(this);
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45, getResources().getDisplayMetrics());
int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 42, getResources().getDisplayMetrics());
The above height and width are in pixels px. 45 being the height in dp and 42 being the width in dp.
index.setLayoutParams(new <Parent>.LayoutParams(width, height));
So, for example, if you've placed your button within a TableRow within a TableLayout, you should have it as TableRow.LayoutParams
index.setLayoutParams(new TableRow.LayoutParams(width, height));

- 3,371
- 2
- 22
- 27
image_view.getLayoutParams().height
returns height value in pixels. You need to get the screen dimensions first to set the values properly.
Display display = context.getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
int screen_height = outMetrics.heightPixels;
int screen_width = outMetrics.widthPixels;
After you get the screen dimensions, you can set the imageview width&height using proper margins.
view.getLayoutParams().height = screen_height - 140;
view.getLayoutParams().width = screen_width - 130 ;

- 4,263
- 1
- 34
- 39
image.setLayoutParams(new ViewGroup.LayoutParams(width, height));
example:
image.setLayoutParams(new ViewGroup.LayoutParams(150, 150));

- 51
- 1
- 3
In order to set the ImageView and Height Programatically, you can do
//Makesure you calculate the density pixel and multiply it with the size of width/height
float dpCalculation = getResources().getDisplayMetrics().density;
your_imageview.getLayoutParams().width = (int) (150 * dpCalculation);
//Set ScaleType according to your choice...
your_imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);

- 1,846
- 1
- 18
- 28
kotlin
val density = Resources.getSystem().displayMetrics.density
view.layoutParams.height = 20 * density.toInt()

- 15,423
- 11
- 100
- 121
In the scenario where the widget size needs to be set programmatically, ensure the below rules.
- Set
LayoutParam
for the Layout in which you are adding that view. In my case I am adding toTableRow
so I had to doTableRow.LayoutParams
- Follow this code
final float scale = getResources().getDisplayMetrics().density;
int dpWidthInPx = (int) (17 * scale);
int dpHeightInPx = (int) (17 * scale);
TableRow.LayoutParams deletelayoutParams = new TableRow.LayoutParams(dpWidthInPx, dpHeightInPx);
button.setLayoutParams(deletelayoutParams);
tableRow.addView(button, 1);

- 10,258
- 5
- 70
- 83
If you want to just fit the image in image view you can use" wrap content" in height and width property with scale-type but if you want to set manually you have to use LayoutParams.
Layoutparams is efficient for setting the layout height and width programmatically.

- 926
- 1
- 10
- 30
int newHeight = 150;
int newWidth = 150;
holder.iv_arrow.requestLayout();
holder.iv_arrow.getLayoutParams().height = newHeight;
holder.iv_arrow.getLayoutParams().width = newWidth;
holder.iv_arrow.setScaleType(ImageView.ScaleType.FIT_XY);
holder.iv_arrow.setImageResource(R.drawable.video_menu);

- 1,622
- 9
- 7