В 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(); принимает значения слева, сверху, справа, снизу соответственно. По часовой стрелке!, Начиная слева.
Источник