Dans ce, de ce et de ce thread, j'ai essayé de trouver une réponse sur la façon de définir les marges sur un seul point de vue. Cependant, je me demandais si il n'y a pas un moyen plus facile. Je vais vous expliquer pourquoi je préfère ne voulez pas utiliser cette approche:
J'ai un Bouton personnalisé qui s'étend Bouton. Si le fond est autre chose que l'arrière-plan par défaut (en appelant setBackgroundResource(int id)
ou setBackgroundDrawable(Drawable d)
- )), je veux les marges à 0. Si j'appelle cela:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Je veux que les marges pour remettre à -3dp (j'ai déjà lu ici comment convertir les pixels du dp, donc une fois que je sais comment définir les marges en px, je peux gérer la conversion moi-même). Mais comme il est appelé dans l' CustomButton
classe, le parent peut varier d'un LinearLayout à TableLayout, et je préfère ne pas avoir à obtenir de ses parents et de vérifier la instanceof que parent. Ça aussi tout à fait inperformant, j'imagine.
Aussi, lors de l'appel (à l'aide de LayoutParams) parentLayout.addView(myCustomButton, newParams)
, je ne sais pas si cela ajoute à la position correcte (n'ai pas essayé), dire le bouton du milieu d'une rangée de cinq.
Question: Est-il un moyen plus facile de définir la marge d'un seul Bouton par programme en plus de l'utilisation LayoutParams?
Merci à l'avance.
EDIT: je sais de la LayoutParams façon, mais j'aimerais une solution qui évite la manipulation de chaque type de conteneur:
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);
}
}
Parce qu' this.getLayoutParams();
renvoie un ViewGroup.LayoutParams
, qui n'ont pas les attributs topMargin
, bottomMargin
, leftMargin
, rightMargin
.
Le mc de l'instance que vous voyez est juste un MarginContainer
qui contient l'offset (-3dp) les marges et (oml, omr, omt, omb) et l'origine des marges (ml, mr, mt, mo).