В Android, как я могу установить поля в dp программно?
Вэтот, этот а такжеэтот Я пытался найти ответ о том, как установить поля для одного представления. Однако мне было интересно, не существует ли более простого способа. Я объясню, почему я бы не хотел использовать этот подход:
У меня есть пользовательская кнопка, которая расширяет кнопку. Если фон установлен на что-то другое, чем фон по умолчанию (вызывая либо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)
Я не знаю, добавляет ли это его в правильное положение (однако не пробовал), скажем, среднюю кнопку в ряду из пяти.
Вопрос: Есть ли более простой способ программно установить поле для одной кнопки?besides using 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
.
The mc instance you see is just a MarginContainer
который содержит поля со смещением (-3dp) и (oml, omr, omt, omb) и исходные поля (ml, mr, mt, mb).