Изменить правильную границу представления программно? - PullRequest
152 голосов
/ 17 декабря 2010

Может ли этот атрибут динамически изменяться в коде Java?

android:layout_marginRight

У меня есть TextView, который должен динамически менять свое положение на несколько пикселей влево.

Как это сделать программно?

Ответы [ 3 ]

424 голосов
/ 17 декабря 2010

РЕДАКТИРОВАТЬ: более общий способ сделать это, который не зависит от типа макета (кроме того, что это тип макета, который поддерживает поля):

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

Вы должны проверить документы для TextView .По сути, вам нужно получить объект TextView LayoutParams, изменить поля, а затем вернуть его обратно в TextView.Предполагая, что он находится в LinearLayout, попробуйте что-то вроде этого:

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

Я не могу проверить это прямо сейчас, поэтому мое приведение может быть немного отключено, но LayoutParams - это то, что нужно изменить, чтобы изменитьполе.

ПРИМЕЧАНИЕ

Не забывайте, что если ваш TextView находится внутри, например, RelativeLayout , следуетиспользуйте RelativeLayout.LayoutParams вместо LinearLayout.LayoutParams

15 голосов
/ 15 января 2014

Используйте LayoutParams (как уже объяснено). Однако будьте осторожны, чтобы выбрать LayoutParams. Согласно https://stackoverflow.com/a/11971553/3184778 «вам нужно использовать тот, который относится к РОДИТЕЛЯм представления, над которым вы работаете, а не к фактическому представлению»

Если, например, TextView находится внутри TableRow, вам нужно использовать TableRow.LayoutParams вместо RelativeLayout или LinearLayout

9 голосов
/ 28 апреля 2016

Используйте эту функцию для установки всех типов полей

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