No Android, como definir margens no dp programaticamente?

Emisto, isto eisto Eu tentei encontrar uma resposta sobre como definir as margens em uma única visão. No entanto, eu queria saber se não há um caminho mais fácil. Vou explicar por que prefiro não usar essa abordagem:

Eu tenho um botão personalizado que estende o botão. Se o fundo estiver definido como algo diferente do plano de fundo padrão (chamandosetBackgroundResource(int id) ousetBackgroundDrawable(Drawable d)), Eu quero que as margens sejam 0. Se eu chamar isso:

public void setBackgroundToDefault() {
    backgroundIsDefault = true;
    super.setBackgroundResource(android.R.drawable.btn_default);
    // Set margins somehow
}

Eu quero as margens para redefinir a -3dp (eu já liAqui como converter de pixels para dp, então quando eu souber como definir margens em px, eu mesmo posso gerenciar a conversão). Mas desde que isso é chamado noCustomButton classe, o pai pode variar de LinearLayout para TableLayout, e eu prefiro não tê-lo obter seu pai e verificar a instância desse pai. Isso também será bastante inperformante, imagino.

Além disso, ao chamar (usando LayoutParams)parentLayout.addView(myCustomButton, newParams), Não sei se isso adiciona à posição correta (ainda não tentei), digamos o botão do meio de uma linha de cinco.

Pergunta: Existe alguma maneira mais fácil de definir a margem de um único botão programaticamentealém de usar LayoutParams?

EDIT: Eu sei da maneira LayoutParams, mas gostaria de uma solução que evita lidar com cada tipo de contêiner 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();retorna umViewGroup.LayoutParams, que não possuem os atributostopMargin, bottomMargin, leftMargin, rightMargin. A instância mc que você vê é apenas umaMarginContainer que contém as margens offset (-3dp) e (oml, omr, omt, omb) e as margens originais (ml, mr, mt, mb).

questionAnswers(12)

yourAnswerToTheQuestion