以编程方式设置 ConstraintLayout 的边距

38

我需要在不同情况下更改由ConstraintLayout制作的工具栏的边距。我尝试以以下方式进行:

ConstraintLayout.LayoutParams newLayoutParams = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.WRAP_CONTENT);
ConstraintLayout.MarginLayoutParams layoutParams = new ConstraintLayout.MarginLayoutParams(newLayoutParams);
layoutParams.setMargins(0, 0, 0, 0);
toolbar.setLayoutParams(newLayoutParams);

但在第二种情况下,layoutParams.setMargins(16, 16, 16, 16);没有改变。因此,有人可以提供其他方法或指出错误的地方。感谢您花时间解决我的问题。

我尝试使用newLayoutParams.setMargins(54, 54, 54, 0);,这会将边距放置在左侧和右侧,但我仍然需要在其上方添加边距。

5个回答

74

最终在@Aksh的帮助下,我找到了我的错误并解决了我的问题。如果有人觉得有用,我会把我的代码放在下面

     ConstraintLayout.LayoutParams newLayoutParams = (ConstraintLayout.LayoutParams) toolbar.getLayoutParams();
     newLayoutParams.topMargin = 0;
     newLayoutParams.leftMargin = 0;
     newLayoutParams.rightMargin = 0;
     toolbar.setLayoutParams(newLayoutParams);

5
如果不起作用,很可能是布局未与父级相连constraintSet.connect(testButton.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START) - Ultimo_m
如果您正在使用Kotlin,可以使用以下代码:var newLayoutParams = ConstraintLayout.LayoutParams(yourLayout.layoutParams) newLayoutParams.rightMargin = 16 yourLayout.layoutParams = newLayoutParams - mask
这个解决方案可行,但是你必须使用像素而不是dp来表示值。下面6rchid在https://dev59.com/LFQK5IYBdhLWcg3wQt1t#56550964的回答帮助了我。 - Andrew Lee

19

在ConstraintLayout中为视图添加边距的好方法

val constraintSet = ConstraintSet()
constraintSet.clone(constraintLayoutId)
val marginTop = context.getDimension(10f)
constraintSet.setMargin(R.id.tv_user, ConstraintSet.TOP, marginTop)
constraintSet.applyTo(constraintLayoutId)

fun Context.getDimension(value: Float): Int {
    return TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, value, this.resources.displayMetrics).toInt()
}

1
它是displayMetrics而不是displayMetric。 - Karan Sharma

13

我曾经使用 ConstraintSet 修改了一个 ConstraintLayout,以更改它所链接的元素。在这个过程中,我也修改了边距,这是 connect 方法的最后一个参数:

ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(layout);
constraintSet.connect(
    R.id.layout_id, 
    ConstraintSet.START, 
    R.id.layout_id2, 
    ConstraintSet.END, 
    8);
constraintSet.applyTo(layout);

也许这能给你另一个线索找到解决方案?


我不知道为什么,但使用ConstraintSet没有改变任何东西。 - Asset Bekbossynov
抱歉,我还没有用工具栏测试过它,只是一些TextView和ImageView。 - Norbert
谢谢,我尝试了以上所有解决方案,但是在应用了上述代码将新的约束条件应用到布局后,边距仍未设置。不过现在它已经起作用了。 - SagaRock101
我终于找到了一些有效的东西。现在我的关键收获是:复制父约束集并应用于相同的父级,连接布局。 - Warpzit

4
您可能想要尝试
ViewGroup.MarginLayoutParams params = yourConstraintLayout.getLayoutParams();
params.topMargin = x;
//others shows up in suggestion

虽然我没有尝试过,但我相信它应该可以工作,因为ConstraintLayout是一个ViewGroup。


谢谢,这帮我找到了我的错误。 - Asset Bekbossynov

2

对于layoutParams.setMargins(w, x, y, z),它没有改变的原因很可能是您将值视为Dp而不是Px,而该方法接受Px。

要从Dp获取Px,您需要使用:

int pxValue = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());

"layoutParams.setMargins(w, x, y, z)"中w、x、y和z代表的是左、上、右和下的边距。如果您想更改边距,请确保使用正确的单位(Px)。您可以使用上面提到的代码将Dp转换为Px。


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