使用 ConstraintSet 以编程方式将 Button 添加到 ConstrainLayout

Posted

技术标签:

【中文标题】使用 ConstraintSet 以编程方式将 Button 添加到 ConstrainLayout【英文标题】:Programmatically add Button to ConstrainLayout with ConstraintSet 【发布时间】:2019-10-31 21:13:12 【问题描述】:

大家好。

我正在尝试以编程方式将按钮添加到 ConstraintLayout 并将 ConstraintSet 设置为此类按钮。 当我尝试从布局中关闭约束集时出现问题,因为我添加的按钮没有 ID。

Button button = new Button(this);

ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(250, ConstraintLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(15,15,15,15);

button.setLayoutParams(params);
button.setText(returnObject.getFunction());
button.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
button.setTextColor(R.drawable.custom_button_color);
button.setBackgroundResource(R.drawable.custom_button);

ConstraintLayout container = findViewById(R.id.highLevelContainer);
container.addView(button);

ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(container); // Here I get the error
constraintSet.connect(button.getId(), ConstraintSet.END , container.getId(), ConstraintSet.END,0);
constraintSet.connect(button.getId(), ConstraintSet.START, container.getId(),ConstraintSet.START,0);
constraintSet.connect(button.getId(), ConstraintSet.TOP, container.getId(), ConstraintSet.TOP);
constraintSet.applyTo(container);

这是控制台上生成的错误:

java.lang.RuntimeException: All children of ConstraintLayout must have ids to use ConstraintSet
    at android.support.constraint.ConstraintSet.clone

我想避免将随机数分配给按钮作为 ID,因为它是在循环中创建的。 知道如何解决这个问题吗?

【问题讨论】:

如果您想避免使用setId(View.generateViewId()) 的随机数,您希望为您的子视图设置什么ID? 完美。非常感谢。 【参考方案1】:

您应该简单地将 id 添加到您的按钮:

Button button = new Button(this);

ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(250, ConstraintLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(15,15,15,15);

button.setLayoutParams(params);
button.setText(returnObject.getFunction());

button.setId(View.generateViewId());   <----HERE

button.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
button.setTextColor(R.drawable.custom_button_color);
button.setBackgroundResource(R.drawable.custom_button);

ConstraintLayout container = findViewById(R.id.highLevelContainer);
container.addView(button);

ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(container); 
constraintSet.connect(button.getId(), ConstraintSet.END , container.getId(), ConstraintSet.END,0);
constraintSet.connect(button.getId(), ConstraintSet.START, container.getId(),ConstraintSet.START,0);
constraintSet.connect(button.getId(), ConstraintSet.TOP, container.getId(), ConstraintSet.TOP);
constraintSet.applyTo(container);

【讨论】:

以上是关于使用 ConstraintSet 以编程方式将 Button 添加到 ConstrainLayout的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式修改 ConstraintSet 链未按预期工作

使用 ConstraintSet 时测量的布局大小为零

什么相当于ConstraintSet中的“toStartOf”和“toTopOf”?

来自 ConstraintSet 的 clone 和 applyTo 使应用程序崩溃

在 iOS 中以编程方式对 UITableView 的约束

Android ConstraintLayout ConstraintSet动态布局