718

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

Eric Schnipke
  • 482
  • 1
  • 6
  • 22
praveenb
  • 10,549
  • 14
  • 61
  • 83
  • 20
    Footnote 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 Answers15

1246

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();
Richard Chambers
  • 16,643
  • 4
  • 81
  • 106
Hakem Zaied
  • 14,061
  • 1
  • 23
  • 25
259

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);
InvulgoSoft
  • 3,231
  • 1
  • 16
  • 6
  • 7
    if 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
  • 3
    Thanks 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
58

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.

Jerry Chan
  • 49
  • 5
duggu
  • 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
    just for better understanding @n00dles ,,, nothing else – duggu Jun 07 '19 at 06:42
50

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.

Hiren Patel
  • 52,124
  • 21
  • 173
  • 151
  • 2
    How 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
  • 1
    Caused 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
20

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;
//...
Community
  • 1
  • 1
Omar
  • 16,329
  • 10
  • 48
  • 66
14

You can set value for all case.

demoImage.getLayoutParams().height = 150;

demoImage.getLayoutParams().width = 150;

demoImage.setScaleType(ImageView.ScaleType.FIT_XY);
abarisone
  • 3,707
  • 11
  • 35
  • 54
tienanhcntt2
  • 139
  • 1
  • 3
  • 4
    Caused 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
12

Simply create a LayoutParams object and assign it to your imageView

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(150, 150);
imageView.setLayoutParams(params);
Zubair Akber
  • 2,760
  • 13
  • 30
11

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));
Ali Kahoot
  • 3,371
  • 2
  • 22
  • 27
6
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 ;
Vikas
  • 4,263
  • 1
  • 34
  • 39
5

image.setLayoutParams(new ViewGroup.LayoutParams(width, height));

example:

image.setLayoutParams(new ViewGroup.LayoutParams(150, 150));
4

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);
BharathRao
  • 1,846
  • 1
  • 18
  • 28
3

kotlin

val density = Resources.getSystem().displayMetrics.density
view.layoutParams.height = 20 * density.toInt()
William Hu
  • 15,423
  • 11
  • 100
  • 121
1

In the scenario where the widget size needs to be set programmatically, ensure the below rules.

  1. Set LayoutParam for the Layout in which you are adding that view. In my case I am adding to TableRow so I had to do TableRow.LayoutParams
  2. 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);

Rohit Mandiwal
  • 10,258
  • 5
  • 70
  • 83
0

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.

raj kavadia
  • 926
  • 1
  • 10
  • 30
0
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);
MEGHA DOBARIYA
  • 1,622
  • 9
  • 7