No presente , este e este segmento Tentei encontrar uma resposta sobre como definir as margens em um único ponto de vista. No entanto, eu queria saber se não há uma maneira mais fácil. Vou explicar por que preferiria não usar essa abordagem:
Eu tenho um botão personalizado que estende o botão. Se o plano de fundo estiver definido como algo diferente do plano de fundo padrão (chamando um setBackgroundResource(int id)
ou setBackgroundDrawable(Drawable d)
), desejo que as margens sejam 0. Se eu chamar isso:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Quero que as margens sejam redefinidas para -3dp (já li aqui como converter de pixels em dp, assim que souber definir margens em px, também posso gerenciar a conversão). Mas como isso é chamado na CustomButton
classe, o pai pode variar de LinearLayout para TableLayout, e eu prefiro que ele não consiga o pai e verifique a instância desse pai. Isso também será bastante inoperante, imagino.
Além disso, ao chamar (usando LayoutParams) parentLayout.addView(myCustomButton, newParams)
, não sei se isso é adicionado à 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 programaticamente além de usar LayoutParams?
EDIT: Eu sei da maneira LayoutParams, mas gostaria de uma solução que evite manipular 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);
}
}
Porque this.getLayoutParams();
retorna um ViewGroup.LayoutParams
, que não têm os atributos topMargin
, bottomMargin
, leftMargin
, rightMargin
. A instância mc que você vê é apenas uma MarginContainer
que contém margens de deslocamento (-3dp) e (oml, omr, omt, omb) e as margens originais (ml, mr, mt, mb).