Android how to set margin

В Android, как я устанавливаю поля в dp программно?

В этом, this и this thread Я попытался найти ответ о том, как установить поля на одном представлении. Однако мне было интересно, нет ли более простого способа. Я объясню, почему я предпочитаю не использовать этот подход:

У меня есть пользовательская кнопка, которая расширяет Button. Если фон установлен на что-то еще, чем фон по умолчанию (вызывая либо setBackgroundResource(int id) , либо setBackgroundDrawable(Drawable d) ), я хочу, чтобы поля были равны 0. Если я вызываю это:

Я хочу, чтобы поля были reset до -3dp (я уже читал здесь, как конвертировать из пикселей в dp, поэтому, как только я знаю, как устанавливать поля в px, я могу управлять преобразованием самостоятельно). Но так как это вызвано в классе CustomButton , родитель может варьироваться от LinearLayout до TableLayout, и я бы предпочел не получить его родителя и проверить экземпляр этого родителя. Полагаю, это тоже будет довольно впечатляюще.

Кроме того, при вызове (используя LayoutParams) parentLayout.addView(myCustomButton, newParams) , я не знаю, добавляет ли он его в правильную позицию (хотя и не пробовал), например, средняя кнопка из пяти.

Вопрос: Существует ли какой-либо более простой способ установить маржу одной кнопки программно , кроме того, используя LayoutParams?

EDIT: Я знаю способ LayoutParams, но мне бы хотелось получить решение, которое позволяет избежать обращения к каждому типу контейнера:

Читайте также:  Как отменить платежи гугл плей с андроида

Потому что this.getLayoutParams(); возвращает ViewGroup.LayoutParams , которые не имеют атрибутов topMargin , bottomMargin , leftMargin , rightMargin . Экземпляр mc, который вы видите, представляет собой всего лишь MarginContainer , который содержит поля смещения (-3dp) и (oml, omr, omt, omb) и исходные поля (ml, mr, mt, mb).

ОТВЕТЫ

Ответ 1

Вы можете использовать LayoutParams для установки полей вашей кнопки:

В зависимости от того, какой макет вы используете, вы должны использовать RelativeLayout.LayoutParams или LinearLayout.LayoutParams .

И чтобы преобразовать меру dp в пиксель, попробуйте следующее:

Ответ 2

LayoutParams — НЕ РАБОТАЕТ!!

Нужно использовать тип: MarginLayoutParams

Пример кода для MarginLayoutParams:

Ответ 3

Как вызвать метод:

Надеюсь, это поможет вам.

Ответ 4

Ответ 5

Вот ответ «все-в-одном» с последними обновлениями:

Шаг 1, чтобы обновить поле

Основная идея — получить маржу и обновить ее. Обновление будет применяться автоматически, и вам не нужно его устанавливать. Чтобы получить параметры макета, просто вызовите этот метод:

LayoutParams происходит из макета вашего представления. Если представление выполнено из линейного макета, вам нужно импортировать LinearLayout.LayoutParams . Если вы используете относительный макет, импортируйте LinearLayout.LayoutParams и т.д.

Теперь, если вы установите маржу с помощью Layout_marginLeft , Right и т.д., вам необходимо обновить маржу таким образом

Если вы устанавливаете маржу с помощью нового layout_marginStart , вам необходимо обновить маржу таким образом.

Шаг 2, чтобы обновить margin в dp

Все два способа обновления поля выше обновляются в пикселях. Вам нужно сделать перевод dp в пиксели.

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

Ответ 6

layout_margin — это ограничение, которое дочерний элемент представления указывает своему родительскому элементу. Однако родительская роль заключается в том, нужно ли разрешать маржу или нет. В основном, установив android: layout_margin = «10dp», ребенок просит группу родительского представления выделить пространство 10dp больше, чем его фактический размер. (padding = «10dp», с другой стороны, означает, что дочернее представление сделает свой собственный контент 10dp меньше.)

Читайте также:  Кликер для ватсапа андроид

Следовательно, не все ViewGroups относятся к маржу. Самый известный пример — listview, где поля элементов игнорируются. Прежде чем вы вызовете setMargin() в LayoutParam, вы всегда должны убедиться, что текущее представление живет в ViewGroup, поддерживающем margin (например, LinearLayouot или RelativeLayout), и передайте результат getLayoutParams() на определенные вами LayoutParams. ( ViewGroup.LayoutParams даже не имеет метода setMargins() !)

Функция ниже должна делать трюк. Однако убедитесь, что вы заменили RelativeLayout на тип родительского представления.

Ответ 7

Этот метод позволит вам установить Margin в DP

UPDATE

Вы можете изменить параметр, который вам подходит.

Ответ 8

Когда вы находитесь в пользовательском представлении, вы можете использовать getDimensionPixelSize(R.dimen.dimen_value) , в моем случае я добавил поле в LayoutParams, созданное по методу init .

Ответ 9

Используйте этот метод, чтобы установить маржу в дп

Ответ 10

Для быстрой настройки в одну строку используйте

но будьте осторожны при любом неправильном использовании с LayoutParams, так как это не будет иметь место, if проверка экземпляра чека

Ответ 11

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

Убедитесь, что в пикселях указано не dp. Удачного кодирования 🙂

Ответ 12

В моем примере я добавляю ImageView к LinearLayout программно. Я установил верхнее и нижнее поля для ImagerView. Затем добавьте ImageView к LinearLayout.

Ответ 13

Вы можете использовать этот метод и поставить статический размер как 20, он преобразует в соответствии с вашим устройством

Ответ 14

В Котлине это будет выглядеть так:

Ответ 15

Как и сегодня, лучше всего использовать Paris, библиотеку, предоставленную AirBnB.

Стили могут быть применены следующим образом:

он также поддерживает пользовательское представление (если вы расширяете представление), используя аннотации:

Читайте также:  Что вредно для андроид

Ответ 16

Вы должны позвонить

вот так: your_view.setPadding(0,16,0,0)

То, что вы пытаетесь использовать, это только получатель.

Студия Android показывает, что на самом деле означает padding. () в Java:

пример заполнения Изображение показывает, что он вызывает только getPadding. ()

Если вы хотите добавить поле в TextView, вам нужно использовать LayoutParams:

Ответ 17

Мне пришлось привести мой к FrameLayout для linearLayout, поскольку он наследуется от него, и установить там поля, чтобы активность отображалась только на части экрана вместе с другим фоном, чем исходные параметры макета в setContentView .

Никто из остальных не работал на использование одного и того же действия и изменение полей на основе открытия упражнения из другого меню! setLayoutParams никогда не работал для меня — устройство зависало каждый раз. Даже если это жестко закодированные числа — это только пример кода только для демонстрации.

Ответ 18

Так же, как вы использовали для установки ширины и высоты ViewGroup.LayoutParams с помощью ViewGroup.LayoutParams

Вы можете использовать ViewGroup.MarginLayoutParams чтобы установить ширину, высоту и поля, довольно ViewGroup.MarginLayoutParams ли?

Где метод setMargins(); принимает значения слева, сверху, справа, снизу соответственно. По часовой стрелке!, Начиная слева.

Источник

Оцените статью