En Android, ¿cómo establezco los márgenes en dp mediante programación?

Enesta, esta yesta 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é prefiero no usar este enfoque:

Tengo un botón personalizado que extiende el botón. Si el fondo está configurado en un valor diferente al predeterminado (llamando asetBackgroundResource(int id) osetBackgroundDrawable(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 establecer los márgenes en px, puedo administrar la conversión yo mismo). Pero como esto se llama en elCustomButton En la clase, el padre puede variar de LinearLayout a TableLayout, y prefiero que él no obtenga a su padre y verifique la instancia de ese padre. Eso también será bastante inoportuno, me imagino.

Además, al llamar (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 configurar el margen de un solo botón programáticamenteAdemás de usar LayoutParams?

EDIT: Sé de la manera de LayoutParams, pero me gustaría una solución que evite el manejo de 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);
    }
}

Porquethis.getLayoutParams();devuelve unViewGroup.LayoutParams, que no tienen los atributostopMargin, bottomMargin, leftMargin, rightMargin. La instancia mc que ves es solo unaMarginContainer que contiene márgenes de compensación (-3dp) y (oml, omr, omt, omb) y los márgenes originales (ml, mr, mt, mb).