【问题标题】:Programmatically set margin to ConstraintLayout以编程方式将边距设置为 ConstraintLayout
【发布时间】:2019-02-08 09:57:46
【问题描述】:

我需要在不同的情况下更改由 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); 这会将边距放在左右两侧,但我仍然需要在其上放置边距。

【问题讨论】:

    标签: android android-constraintlayout


    【解决方案1】:

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

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

    【讨论】:

    • 如果它不工作,很可能是因为布局没有与父级constraintSet.connect(testButton.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START)
    • 如果你使用 Kotli,var newLayoutParams = ConstraintLayout.LayoutParams(yourLayout.layoutParams) newLayoutParams.rightMargin = 16 yourLayout.layoutParams = newLayoutParams
    • 此解决方案有效,但您必须使用像素而不是 dp 作为值。 6rchid 下面的这个答案stackoverflow.com/a/56550964/3697107 帮助了我。
    【解决方案2】:

    在约束布局中为视图添加边距的好方法

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

    【讨论】:

    • 是 displayMetrics 而不是 displayMetric
    【解决方案3】:

    我曾经用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 并没有改变任何东西
    • 对不起,我没有用工具栏测试过,只是一些TextView和ImageView。
    • 谢谢,我厌倦了上述所有解决方案,但在使用上述代码将新约束应用于其工作的布局后,未设置边距
    【解决方案4】:

    你可以试试

    ViewGroup.MarginLayoutParams params = yourConstraintLayout.getLayoutParams();
    params.topMargin = x;
    //others shows up in suggestion
    

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

    【讨论】:

    • 感谢它帮助我找到了我的错误
    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      相关资源
      最近更新 更多