533 votes

Dans Android, comment puis-je définir des marges en dp par programmation

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).

959voto

throrin19 Points 2907

Vous devez utiliser LayoutParams configurer votre bouton marges:

LayoutParams params = new LayoutParams(
        LayoutParams.WRAP_CONTENT,      
        LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);

Selon la mise en page que vous utilisez, vous devez utiliser RelativeLayout.LayoutParams ou LinearLayout.LayoutParams.

Et de convertir vos dp mesure de pixel, essayez ceci:

Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        yourdpmeasure, 
        r.getDisplayMetrics()
);

290voto

Lyusten Points 221

LayoutParams - PAS de TRAVAIL ! ! !

Besoin d'utiliser un type d': MarginLayoutParams

MarginLayoutParams params = (MarginLayoutParams) vector8.getLayoutParams();
params.width = 200; params.leftMargin = 100; params.topMargin = 200;
vector8.setLayoutParams(params);

Exemple de Code pour MarginLayoutParams:

http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X