En este , este y este hilo intenté encontrar una respuesta sobre cómo establecer los márgenes en una sola vista. Sin embargo, me preguntaba si no hay una manera más fácil. Explicaré por qué preferiría no usar este enfoque:
Tengo un botón personalizado que extiende el botón. Si el fondo se establece en algo más que el fondo por defecto (ya sea llamando setBackgroundResource(int id)
o setBackgroundDrawable(Drawable d)
), quiero que los márgenes sean 0. Si llamo a esto:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Quiero que los márgenes se restablezcan a -3dp (ya leí aquí cómo convertir de píxeles a dp, así que una vez que sepa cómo configurar los márgenes en px, puedo gestionar la conversión yo mismo). Pero como esto se llama en la CustomButton
clase, el padre puede variar de LinearLayout a TableLayout, y prefiero que no obtenga a su padre y verifique la instancia de ese padre. Eso también será bastante deficiente, me imagino.
Además, cuando llamo (usando LayoutParams) parentLayout.addView(myCustomButton, newParams)
, no sé si esto lo agrega a la posición correcta (sin embargo, no lo he intentado), diga el botón central de una fila de cinco.
Pregunta: ¿Hay alguna manera más fácil de establecer el margen de un solo botón mediante programación además de usar LayoutParams?
EDITAR: conozco la forma de LayoutParams, pero me gustaría una solución que evite manejar cada tipo de contenedor diferente:
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);
}
}
Debido a que this.getLayoutParams();
devuelve una ViewGroup.LayoutParams
, que no tienen los atributos topMargin
, bottomMargin
, leftMargin
, rightMargin
. La instancia de mc que ve es solo una MarginContainer
que contiene márgenes de desplazamiento (-3dp) y (oml, omr, omt, omb) y los márgenes originales (ml, mr, mt, mb).