В этом, this и this thread Я попытался найти ответ о том, как установить поля на одном представлении. Однако мне было интересно, нет ли более простого способа. Я объясню, почему я предпочитаю не использовать этот подход:
У меня есть пользовательская кнопка, которая расширяет Button. Если фон установлен на что-то еще, чем фон по умолчанию (вызывая либо setBackgroundResource(int id)
, либо setBackgroundDrawable(Drawable d)
), я хочу, чтобы поля были равны 0. Если я вызываю это:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Я хочу, чтобы поля были reset до -3dp (я уже читал здесь, как конвертировать из пикселей в dp, поэтому, как только я знаю, как устанавливать поля в px, я могу управлять преобразованием самостоятельно). Но так как это вызвано в классе CustomButton
, родитель может варьироваться от LinearLayout до TableLayout, и я бы предпочел не получить его родителя и проверить экземпляр этого родителя. Полагаю, это тоже будет довольно впечатляюще.
Кроме того, при вызове (используя LayoutParams) parentLayout.addView(myCustomButton, newParams)
, я не знаю, добавляет ли он его в правильную позицию (хотя и не пробовал), например, средняя кнопка из пяти.
Вопрос: Существует ли какой-либо более простой способ установить маржу одной кнопки программно , кроме того, используя LayoutParams?
EDIT: Я знаю способ LayoutParams, но мне бы хотелось получить решение, которое позволяет избежать обращения к каждому типу контейнера:
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
Потому что this.getLayoutParams();
возвращает ViewGroup.LayoutParams
, которые не имеют атрибутов topMargin
, bottomMargin
, leftMargin
, rightMargin
.
Экземпляр mc, который вы видите, представляет собой всего лишь MarginContainer
, который содержит поля смещения (-3dp) и (oml, omr, omt, omb) и исходные поля (ml, mr, mt, mb).