web-dev-qa-db-fra.com

Changer la bonne marge d'une vue par programme?

Cet attribut peut-il être modifié dynamiquement dans le code Java?

Android:layout_marginRight

J'ai un TextView, qui doit changer sa position de quelques pixels à gauche dynamiquement.

Comment le faire par programme?

154

EDIT: Une manière plus générique de faire cela qui ne repose pas sur le type de présentation (à part que c'est un type de présentation qui prend en charge les marges):

public static void setMargins (View v, int l, int t, int r, int b) {
    if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
        p.setMargins(l, t, r, b);
        v.requestLayout();
    }
}

Vous devriez vérifier la documentation pour TextView . En gros, vous souhaiterez obtenir l'objet LayoutParams de TextView, modifier les marges, puis le redéfinir sur TextView. En supposant qu'il s'agisse d'un LinearLayout, essayez quelque chose comme ceci:

TextView tv = (TextView)findViewById(R.id.my_text_view);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, 0, 10, 0); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);

Je ne peux pas le tester pour le moment, mon casting peut donc être légèrement décalé, mais ce sont les LayoutParams qui doivent être modifiés pour changer la marge.

REMARQUE

N'oubliez pas que si votre TextView est à l'intérieur, par exemple, un RelativeLayout , vous devez utiliser RelativeLayout.LayoutParams au lieu de LinearLayout.LayoutParams

432
kcoppock

Utilisez LayoutParams (comme déjà expliqué). Attention toutefois aux LayoutParams à choisir. Selon https://stackoverflow.com/a/11971553/3184778 "vous devez utiliser celui qui concerne le PARENT de la vue sur laquelle vous travaillez, pas la vue réelle"

Si, par exemple, TextView est à l'intérieur d'un TableRow, vous devez utiliser TableRow.LayoutParams au lieu de RelativeLayout ou LinearLayout.

15
kouretinho

tilisez cette fonction pour définir tous les types de marges

      public void setViewMargins(Context con, ViewGroup.LayoutParams params,      
       int left, int top , int right, int bottom, View view) {

    final float scale = con.getResources().getDisplayMetrics().density;
    // convert the DP into pixel
    int pixel_left = (int) (left * scale + 0.5f);
    int pixel_top = (int) (top * scale + 0.5f);
    int pixel_right = (int) (right * scale + 0.5f);
    int pixel_bottom = (int) (bottom * scale + 0.5f);

    ViewGroup.MarginLayoutParams s = (ViewGroup.MarginLayoutParams) params;
    s.setMargins(pixel_left, pixel_top, pixel_right, pixel_bottom);

    view.setLayoutParams(params);
}
9
Rohit Rathore

Dans Kotlin, vous pouvez déclarer une fonction d'extension telle que:

fun View.setMargins(
    leftMarginDp: Int? = null,
    topMarginDp: Int? = null,
    rightMarginDp: Int? = null,
    bottomMarginDp: Int? = null
) {
    if (layoutParams is ViewGroup.MarginLayoutParams) {
        val params = layoutParams as ViewGroup.MarginLayoutParams
        leftMarginDp?.run { params.leftMargin = this.dpToPx(context) }
        topMarginDp?.run { params.topMargin = this.dpToPx(context) }
        rightMarginDp?.run { params.rightMargin = this.dpToPx(context) }
        bottomMarginDp?.run { params.bottomMargin = this.dpToPx(context) }
        requestLayout()
    }
}

fun Int.dpToPx(context: Context): Int {
    val metrics = context.resources.displayMetrics
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), metrics).toInt()
}

Ensuite, vous pouvez l'appeler comme suit:

myView1.setMargins(8, 16, 34, 42)

Ou:

myView2.setMargins(topMarginDp = 8) 
1
David Miguel