В этой , этой и этой ветке я попытался найти ответ о том, как установить поля для одного представления. Однако мне было интересно, если нет более легкого пути. Я объясню, почему я не хотел бы использовать этот подход:
У меня есть пользовательская кнопка, которая расширяет кнопку. Если задан фон, отличный от фона по умолчанию (вызывая либо setBackgroundResource(int id)
или setBackgroundDrawable(Drawable d)
), я хочу, чтобы поля были равны 0. Если я вызываю это:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Я хочу, чтобы поля были сброшены в -3dp (я уже читал здесь, как конвертировать из пикселей в dp, поэтому, когда я знаю, как установить поля в px, я могу сам управлять конвертацией). Но так как это вызывается в CustomButton
классе, родитель может варьироваться от LinearLayout до TableLayout, и я бы предпочел, чтобы он не брал своего родителя и не проверял экземпляр этого родителя. Я полагаю, это также будет совершенно неэффективно.
Кроме того, при вызове (используя LayoutParams) parentLayout.addView(myCustomButton, newParams)
я не знаю, добавляет ли это его в правильную позицию (однако не пробовал), скажем, среднюю кнопку ряда из пяти.
Вопрос: Есть ли более простой способ установить поле для одной кнопки программно, кроме использования LayoutParams?
РЕДАКТИРОВАТЬ: я знаю способ 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).