Android代码:以编程方式设置边距

25

我按下按钮后,希望能以编程方式将文本字段从当前位置向左移动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文件中的所有值,并仅更改左边距的值?

7个回答

27

试试这段代码:

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

对于 Xamarin,抛出无效转换异常。 - bh_earth0
2
确保将控件的布局参数转换为其父级的类型。例如,如果该控件位于ConstraintLayout中,则使用ConstraintLayout.LayoutParams。 - Aba
1
如果您的主父布局是LinearLayout,则使用LinearLayout.LayoutParams作为参数。 - M DEV

23

好的,

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

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

在尝试了许多其他解决方案后,这个对我有用。谢谢。 - gaurav jain
1
希望边距像其他一样使用DP。讨厌不得不转换为像素。 - JPM

9
如果你使用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)

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

5
您可以尝试一下:

ImageView _circle=(ImageView) findViewById(R.id.image);
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) _circle.getLayoutParams();
int _20 = (int)getResources().getDimension(R.dimen.image_margin); 
// Directly set 20
mlp.setMargins(_20, _20, _20, _20);

5

扩展 @enyciaa 的回答:使用 Kotlin,你可以使用扩展函数,但是不必为每个边距创建一个扩展函数,而是可以使用可空值来表示所有边距,然后只填充非空值:

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)

0

只需在 Kotlin 中使用这几行代码即可

val params = your_view.layoutParams as ViewGroup.MarginLayoutParams
params.setMargins(dpToPx(80, this), dpToPx(0, this), dpToPx(0, this), dpToPx(0, this))

这是函数dpToPx的代码

private fun dpToPx(dp: Int, context: Context): Int {
    val density = context.resources.displayMetrics.density
    return (dp.toFloat() * density).roundToInt()
}

如果您正在使用Fragment,请使用requireContext()作为上下文参数。从Activity中,像我一样使用this作为上下文。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接