Как установить поля ImageView с помощью кода, а не XML - PullRequest
167 голосов
/ 05 августа 2010

Я хочу добавить неизвестное количество ImageView просмотров к моему макету с полем. В XML я могу использовать layout_margin так:

<ImageView android:layout_margin="5dip" android:src="@drawable/image" />

Существует ImageView.setPadding(), но нет ImageView.setMargin(). Я думаю, что это в духе ImageView.setLayoutParams(LayoutParams), но не уверен, что в это вписывается.

Кто-нибудь знает?

Ответы [ 13 ]

363 голосов
/ 05 августа 2010

android.view.ViewGroup.MarginLayoutParams имеет метод setMargins(left, top, right, bottom). Прямые подклассы: FrameLayout.LayoutParams, LinearLayout.LayoutParams и RelativeLayout.LayoutParams.

Используя, например, LinearLayout

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(left, top, right, bottom);
imageView.setLayoutParams(lp);

MarginLayoutParams

Устанавливает поля в пикселях. Для масштабирования используйте

context.getResources().getDisplayMetrics().density

DisplayMetrics

47 голосов
/ 08 марта 2011
    image = (ImageView) findViewById(R.id.imageID);
    MarginLayoutParams marginParams = new MarginLayoutParams(image.getLayoutParams());
    marginParams.setMargins(left_margin, top_margin, right_margin, bottom_margin);
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
    image.setLayoutParams(layoutParams);
35 голосов
/ 04 сентября 2015

Все приведенные выше примеры на самом деле ЗАМЕНЯЮТ любые параметры, уже присутствующие в представлении, которые могут быть нежелательны. Приведенный ниже код просто расширит существующие параметры, не заменяя их:

ImageView myImage = (ImageView) findViewById(R.id.image_view);
MarginLayoutParams marginParams = (MarginLayoutParams) image.getLayoutParams();
marginParams.setMargins(left, top, right, bottom);
21 голосов
/ 15 июня 2013

Код Кевина создает избыточный объект MarginLayoutParams.Более простая версия:

ImageView image = (ImageView) findViewById(R.id.main_image);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(image.getLayoutParams());
lp.setMargins(50, 100, 0, 0);
image.setLayoutParams(lp);
11 голосов
/ 18 февраля 2016

Если вы хотите изменить поля изображения, но оставить все поля без изменений.

  1. Получите MarginLayoutParameters вашего изображения в этом случае: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
    
  2. Теперь просто измените поле, которое хотите изменить, но оставьте остальные как есть:

     marginParams.setMargins(marginParams.leftMargin, 
                             marginParams.topMargin, 
                             150, //notice only changing right margin
                             marginParams.bottomMargin); 
    
8 голосов
/ 05 февраля 2015

Вы можете использовать этот метод, если хотите указать поля в dp:

private void addMarginsInDp(View view, int leftInDp, int topInDp, int rightInDp, int bottomInDp) {
    DisplayMetrics dm = view.getResources().getDisplayMetrics();
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    lp.setMargins(convertDpToPx(leftInDp, dm), convertDpToPx(topInDp, dm), convertDpToPx(rightInDp, dm), convertDpToPx(bottomInDp, dm));
    view.setLayoutParams(lp);
}

private int convertDpToPx(int dp, DisplayMetrics displayMetrics) {
    float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics);
    return Math.round(pixels);
}
5 голосов
/ 17 ноября 2015

Я просто использую это и прекрасно работает:

ImageView imageView = (ImageView) findViewById(R.id.image_id);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
layoutParams.setMargins(left, top, right, bottom);
imageView.setLayoutParams(layoutParams);

setMargins () * Единица измерения 1005 * - пиксель, а не dp. Если вы хотите установить поле в dp, просто в вашем файле values ​​/ dimensions.xml создайте ваши измерения, например:

<resources>
    <dimen name="right">16dp</dimen>
    <dimen name="left">16dp</dimen>    
</resources>

и доступ как:

getResources().getDimension(R.dimen.right);
4 голосов
/ 02 сентября 2017

Если вы используете kotlin, это можно упростить, создав функцию расширения

fun View.setMarginExtensionFunction(left: Int, top: Int, right: Int, bottom: Int) {
  val params = layoutParams as ViewGroup.MarginLayoutParams
  params.setMargins(left, top, right, bottom)
  layoutParams = params
}

Теперь все, что вам нужно, это представление, и эту функцию расширения можно использовать где угодно.

4 голосов
/ 02 июня 2015

Для меня это сработало:

int imgCarMarginRightPx = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, definedValueInDp, res.getDisplayMetrics());

MarginLayoutParams lp = (MarginLayoutParams) imgCar.getLayoutParams();
lp.setMargins(0,0,imgCarMarginRightPx,0);
imgCar.setLayoutParams(lp);
4 голосов
/ 27 апреля 2015

создать макет динамически и установить его параметр, так как setmargin () не будет работать напрямую с imageView

ImageView im;
im = (ImageView) findViewById(R.id.your_image_in_XML_by_id);
 RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(im.getLayoutParams());
                        layout.setMargins(counter*27, 0, 0, 0);//left,right,top,bottom
                        im.setLayoutParams(layout);
                        im.setImageResource(R.drawable.yourimage)
...