android以编程方式设置边距

时间:2016-03-20 14:19:23

标签: android

按下按钮后,我想以编程方式从实际位置+ 20左边缘移动文本字段。

这是我的xml文件:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dp"
    android:paddingBottom="5dp">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/txtField"
        android:layout_below="@+id/txtField2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="20dp"
        android:layout_toLeftOf="@+id/Seperator"
        android:layout_toStartOf="@+id/Seperator"
        android:layout_marginRight="10p" />

    ....


</RelativeLayout>

我试过这段代码:

parameter = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
parameter.setMargins(30, 32, 10, 0); // left, top, right, bottom
txtField.setLayoutParams(parameter);

这是半最优的。 有没有办法使用xml文件的所有值,只能以编程方式更改左边距值?

6 个答案:

答案 0 :(得分:13)

是的,

以下面的方法为例,更新给定视图的左边距:

public static void setMarginLeft(View v, int left) {
    ViewGroup.MarginLayoutParams params =   
                                (ViewGroup.MarginLayoutParams)v.getLayoutParams();
    params.setMargins(left, params.topMargin, 
                            params.rightMargin, params.bottomMargin);
}

答案 1 :(得分:11)

试试这段代码:

parameter =  (RelativeLayout.LayoutParams) txtField.getLayoutParams();
parameter.setMargins(leftMargin, parameter.topMargin, parameter.rightMargin, parameter.bottomMargin); // left, top, right, bottom
txtField.setLayoutParams(parameter);

答案 2 :(得分:4)

您也可以尝试

// if cell is of kind textview cell
return UITableViewAutomaticDimension
// else
return some static value

答案 3 :(得分:0)

如果您使用kotlin,可以通过创建扩展功能

来简化
fun View.setMarginLeft(leftMargin: Int) {
  val params = layoutParams as ViewGroup.MarginLayoutParams
  params.setMargins(left, params.topMargin, params.rightMargin, params.bottomMargin)
  layoutParams = params
}

现在您只需要一个视图,此扩展功能可以在任何地方使用。

val textView = findViewById(R.id.textView)
val marginLeft = context.resources.getDimension(R.dimen.marginLeft).toInt()
textView.setMarginLeft(marginLeft)

注意:此扩展功能将保留所有其他边距,不会覆盖任何边距

答案 4 :(得分:0)

扩展 @enyciaa答案:通过使用Kotlin,您可以使用扩展,但是可以为每个边距边创建一个扩展函数,可以对所有边使用空值,然后仅填充不为null的值:

fun View.setMargin(leftMargin: Int? = null, topMargin: Int? = null,
               rightMargin: Int? = null, bottomMargin: Int? = null) {
    val params = layoutParams as ViewGroup.MarginLayoutParams
    params.setMargins(
        leftMargin ?: params.leftMargin,
        topMargin ?: params.topMargin,
        rightMargin ?: params.rightMargin,
        bottomMargin ?: params.bottomMargin)
    layoutParams = params 
}

因此,如果您要仅设置 左页边距,可以通过指定以下参数名称来做到这一点:

textView.setMargin(leftMargin = marginValue)

答案 5 :(得分:0)

这适用于 Android 30

val textView = TextView(this)
val layoutParams = ViewGroup.MarginLayoutParams(10, 10)
layoutParams.marginStart = 5
textView.layoutParams = layoutParams

设置填充 -

textView.setPadding(2, 2, 2, 2)