Dans Android, comment définir les marges dans dp par programme?

Dans ceci , 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 manière plus facile. Je vais expliquer pourquoi je ne voudrais pas utiliser cette approche:

J'ai un bouton personnalisé qui étend le bouton. Si l'arrière-plan est réglé sur autre chose que l'arrière-plan par défaut (en appelant setBackgroundResource(int id) ou setBackgroundDrawable(Drawable d) ), je veux que les marges soient 0. Si j'appelle ceci:

  • Utilisation du robinet mobile jquery au lieu de cliquer
  • Comment éviter les déclencheurs multiples sur EditText alors que l'utilisateur tape?
  • Comment passer par programme des onglets en utilisant buttonclick dans Android
  • Android Bitmap.createScaledBitmap lance java.lang.OutOfMemoryError principalement sur Jelly Bean 4.1
  • Android CardView supprimer le rembourrage
  • Modification des paramètres régionaux: Forcer l'activité à recharger les ressources?
  •  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 de 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 classe CustomButton , le parent peut varier de LinearLayout à TableLayout, et je préfère ne pas avoir son père et sa mère et vérifier l'instance de ce parent. Cela sera aussi ininterrompue, j'imagine.

    En outre, lors de l'appel (en utilisant LayoutParams) parentLayout.addView(myCustomButton, newParams) , je ne sais pas si cela l'ajoute à la position correcte (n'a pas essayé cependant), disons le bouton du milieu d'une rangée de cinq.

    Question: Existe-t-il un moyen plus simple de définir la marge d'un seul bouton de façon programmée en plus d'utiliser LayoutParams?

    EDIT: Je connais le mode 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(); ViewGroup.LayoutParams un ViewGroup.LayoutParams , qui n'a pas les attributs topMargin , bottomMargin , leftMargin , rightMargin . L'instance mc que vous voyez est juste un MarginContainer qui contient des marges offset (-3dp) et (oml, omr, omt, omb) et les marges d'origine (ml, mr, mt, mb).

  • Différence de la version Google Maps API
  • Comment faire une pause pour handler.postDelayed () timer sur Android
  • Les fragments de ViewPager sont-ils détruits au fil du temps?
  • Recevoir les événements d'installation et de désinstallation du paquet
  • CommitAllowingStateLoss () et commit () fragment
  • JavaCard 3 dans le monde réel?
  • 6 Solutions collect form web for “Dans Android, comment définir les marges dans dp par programme?”

    Vous devez utiliser LayoutParams pour définir les marges de vos boutons:

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

    Selon la disposition que vous utilisez, vous devez utiliser RelativeLayout.LayoutParams ou LinearLayout.LayoutParams .

    Et pour convertir votre mesure dp en pixel, essayez ceci:

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

    LayoutParams – PAS TRAVAILLER! ! !

    Besoin d'un type d'utilisation: MarginLayoutParams

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

    Exemple de code pour MarginLayoutParams:

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

    Meilleur moyen:

     private void setMargins (View view, int left, int top, int right, int bottom) { if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); p.setMargins(left, top, right, bottom); view.requestLayout(); } } 

    Comment appeler méthode:

     setMargins(mImageView, 50, 50, 50, 50); 

    J'espère que ceci vous aidera.

     int sizeInDP = 16; int marginInDp = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, sizeInDP, getResources() .getDisplayMetrics()); 

    alors

     layoutParams = myView.getLayoutParams() layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp); myView.setLayoutParams(layoutParams); 

    Ou

     LayoutParams layoutParams = new LayoutParams... layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp); myView.setLayoutParams(layoutParams); 

    Layout_margin est une contrainte qu'un enfant d'affichage indique à son parent. Toutefois, le rôle des parents consiste à choisir d'autoriser ou non la marge. Fondamentalement, en configurant Android: layout_margin = "10dp", l'enfant demande au groupe de vues parent d'allouer un espace qui est 10dp plus grand que sa taille réelle. (Le remplissage = "10dp", d'autre part, signifie que la vue pour enfant rendra son contenu 10dp plus petit ).

    En conséquence, tous les Groupes de View ne respectent pas la marge . L'exemple le plus notoire serait la liste, où les marges des éléments sont ignorées. Avant d'appeler setMargin() sur LayoutParam, vous devez toujours vous assurer que la vue actuelle habite dans un ViewGroup qui prend en charge la marge (p. Ex. LinearLayouot ou RelativeLayout) et lance le résultat de getLayoutParams() vers les LayoutParams spécifiques que vous souhaitez. ( ViewGroup.LayoutParams n'a même pas la méthode setMargins() !)

    La fonction ci-dessous devrait faire l'affaire. Cependant, assurez-vous de remplacer RelativeLayout par le type de la vue parentale.

     private void setMargin(int marginInPx) { RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams(); lp.setMargins(marginInPx,marginInPx, marginInPx, marginInPx); setLayoutParams(lp); } 

    Cette méthode vous permettra de définir la marge en DP

     public void setMargin(Context con,ViewGroup.LayoutParams params,int dp) { final float scale = con.getResources().getDisplayMetrics().density; // convert the DP into pixel int pixel = (int)(dp * scale + 0.5f); ViewGroup.MarginLayoutParams s =(ViewGroup.MarginLayoutParams)params; s.setMargins(pixel,pixel,pixel,pixel); yourView.setLayoutParams(params); } 

    METTRE À JOUR

    Vous pouvez modifier le paramètre qui convient à vos besoins.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.