it-swarm-es.com

¿Cambiar el margen derecho de una vista mediante programación?

¿Se puede cambiar este atributo dinámicamente en el código Java?

Android:layout_marginRight

Tengo una TextView, que tiene que cambiar su posición algunos píxeles a la izquierda dinámicamente.

¿Cómo hacerlo programáticamente?

151

EDITAR: Una forma más genérica de hacer esto que no se basa en el tipo de diseño (aparte de eso, es un tipo de diseño que admite márgenes):

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();
    }
}

Debe revisar los documentos para TextView . Básicamente, querrá obtener el objeto LayoutParams de TextView, y modificar los márgenes, y luego volver a establecerlo en TextView. Suponiendo que esté en un LinearLayout, intente algo como esto:

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

No puedo probarlo en este momento, por lo que mi lanzamiento puede estar fuera un poco, pero los LayoutParams son los que deben modificarse para cambiar el margen.

NOTA

No olvides que si tu TextView está dentro, por ejemplo, unRelativeLayout, debes usarRelativeLayout.LayoutParamsen lugar de LinearLayout .LayoutParams

417
kcoppock

Utilice LayoutParams (como ya se explicó). Sin embargo, tenga cuidado de qué LayoutParams para elegir. De acuerdo con https://stackoverflow.com/a/11971553/3184778 "necesita usar el que se relaciona con el PADRE de la vista en la que está trabajando, no la vista real"

Si, por ejemplo, TextView está dentro de TableRow, entonces necesita usar TableRow.LayoutParams en lugar de RelativeLayout o LinearLayout

15
kouretinho

Utilice esta función para establecer todos los tipos de márgenes

      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);
}
8
Rohit Rathore