以编程方式更改视图的右边距?

时间:2010-12-17 16:12:02

标签: android layout textview

可以在Java代码中动态更改此属性吗?

android:layout_marginRight

我有一个TextView,必须动态地将其位置向左移动一些像素。

如何以编程方式执行此操作?

4 个答案:

答案 0 :(得分:419)

编辑:一种更通用的方法,不依赖于布局类型(除了它是支持边距的布局类型):

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在里面,例如,a    RelativeLayout ,应该使用 RelativeLayout.LayoutParams 而不是   LinearLayout.LayoutParams

答案 1 :(得分:15)

使用LayoutParams(已经说明)。但是要小心选择哪个LayoutParams。根据{{​​3}}“您需要使用与您正在处理的视图的父项相关的那个,而不是实际视图”

例如,如果TextView在TableRow中,那么您需要使用TableRow.LayoutParams而不是RelativeLayout或LinearLayout

答案 2 :(得分:8)

使用此功能设置所有边距类型

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

答案 3 :(得分:0)

在Kotlin中,您可以声明扩展函数,例如:

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

然后您可以这样称呼它:

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

或者:

myView2.setMargins(topMarginDp = 8)