Может ли этот атрибут динамически изменяться в коде Java?
android:layout_marginRight
У меня есть TextView
, который должен изменить свою позицию несколько пикселей влево динамически.
Как это сделать программно?
РЕДАКТИРОВАТЬ: более общий способ сделать это, который не зависит от типа макета (кроме того, что это тип макета, который поддерживает поля):
public static void setMargins (View v, int l, int t, int r, int b) {
if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
p.setMargins(l, t, r, b);
v.requestLayout();
}
}
Вы должны проверить документы для TextView . По сути, вам нужно получить объект LayoutParams в TextView, изменить поля, а затем вернуть его обратно в TextView. Предполагая, что это в LinearLayout, попробуйте что-то вроде этого:
TextView tv = (TextView)findViewById(R.id.my_text_view);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, 0, 10, 0); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);
Я не могу проверить это прямо сейчас, поэтому мой кастинг может быть немного отключен, но LayoutParams - это то, что нужно изменить, чтобы изменить маржу.
Не забывайте, что если ваш TextView находится внутри, например, RelativeLayout , следует использовать RelativeLayout.LayoutParams вместо LinearLayout.LayoutParams
Используйте LayoutParams (как уже объяснялось). Однако будьте осторожны, чтобы выбрать LayoutParams. Согласно https://stackoverflow.com/a/11971553/3184778 «вам нужно использовать тот, который относится к РОДИТЕЛЯм представления, над которым вы работаете, а не к фактическому представлению»
Если, например, TextView находится внутри TableRow, то вам нужно использовать TableRow.LayoutParams вместо RelativeLayout или LinearLayout
источник
Используйте эту функцию для установки всех типов полей
источник
Обновление: Android KTX
Модуль Core KTX предоставляет расширения для общих библиотек, которые являются частью платформы Android,
androidx.core.view
среди них.Следующие функции расширения удобны для работы с полями:
setMargins()
функция расширения:Устанавливают задворки всех осей в
ViewGroup
«сMarginLayoutParams
. (Размерность должна быть представлена в пикселях, см. Последний раздел, если вы хотите работать с dp)updateMargins()
функция расширения:Обновления на полях в
ViewGroup
«сViewGroup.MarginLayoutParams
.updateMarginsRelative()
функция расширения:Обновляет относительные поля в
ViewGroup
'sMarginLayoutParams
(начало / конец вместо левого / правого).Следующие свойства расширения удобны для получения текущих полей:
dp
вместоpx
:Если вы хотите работать с
dp
(независимыми от плотности пикселей) вместоpx
, вам нужно сначала преобразовать их. Вы можете легко сделать это с помощью следующего свойства extension:Затем вы можете вызвать предыдущие функции расширения, такие как:
Старый ответ:
В Kotlin вы можете объявить функцию расширения как:
Тогда вы можете назвать это как:
Или:
источник