En cela , ceci et ce fil, j'ai essayé de trouver une réponse sur la façon de définir les marges sur une seule vue. Cependant, je me demandais s'il n'y avait pas de moyen plus simple. Je vais expliquer pourquoi je préfère ne pas utiliser cette approche:
J'ai un bouton personnalisé qui étend le bouton. Si l'arrière-plan est défini sur autre chose que l'arrière-plan par défaut (en appelant l'un setBackgroundResource(int id)
ou l' autre setBackgroundDrawable(Drawable d)
), je veux que les marges soient 0. Si j'appelle ceci:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Je veux que les marges soient réinitialisées à -3dp (j'ai déjà lu ici comment convertir des pixels en dp, donc une fois que je sais comment définir des marges en px, je peux gérer la conversion moi-même). Mais comme cela est appelé dans la CustomButton
classe, le parent peut varier de LinearLayout à TableLayout, et je préfère ne pas le faire chercher son parent et vérifier l'instance de ce parent. Ce sera également assez peu performant, j'imagine.
De plus, lors de l'appel (en utilisant LayoutParams) parentLayout.addView(myCustomButton, newParams)
, je ne sais pas si cela l'ajoute à la bonne position (je n'ai pas essayé cependant), disons le bouton central d'une rangée de cinq.
Question: Existe-t-il un moyen plus simple de définir la marge d'un seul bouton par programme en plus d'utiliser LayoutParams?
EDIT: Je connais la méthode LayoutParams, mais j'aimerais une solution qui évite de gérer chaque type de conteneur différent:
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 que this.getLayoutParams();
renvoie une ViewGroup.LayoutParams
, qui n'ont pas les attributs topMargin
, bottomMargin
, leftMargin
, rightMargin
. L'instance mc que vous voyez est juste une MarginContainer
qui contient des marges décalées (-3dp) et (oml, omr, omt, omb) et les marges d'origine (ml, mr, mt, mb).