使用 ConstraintLayout 以编程方式连接设置为任意大小的多个视图
Posted
技术标签:
【中文标题】使用 ConstraintLayout 以编程方式连接设置为任意大小的多个视图【英文标题】:Programmatically connecting multiple views set to any size using ConstraintLayout 【发布时间】:2017-01-13 21:19:08 【问题描述】:我正在使用 ConstraintLayout beta4 并尝试以编程方式在屏幕上创建水平链。
我遇到的问题是当我在屏幕上将多个视图连接在一起时
(ex: Left side of layout <-> leftButton <-> rightButton <-> Right side of layout)
然后什么都没有出现。
这是不起作用的代码:
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
ConstraintLayout layout = (ConstraintLayout) View.inflate(this, R.layout.activity_main, null);
setContentView(layout);
ConstraintSet set = new ConstraintSet();
set.clone(layout);
ConstraintLayout.LayoutParams anySizeParams = new ConstraintLayout.LayoutParams(0,0);
ImageButton leftButton = new ImageButton(this);
leftButton.setId(View.generateViewId());
leftButton.setLayoutParams(anySizeParams);
layout.addView(leftButton);
ImageButton rightButton = new ImageButton(this);
rightButton.setId(View.generateViewId());
rightButton.setLayoutParams(anySizeParams);
layout.addView(rightButton);
set.connect(leftButton.getId(),ConstraintSet.LEFT,layout.getId(),ConstraintSet.LEFT,0);
set.connect(leftButton.getId(),ConstraintSet.RIGHT,rightButton.getId(),ConstraintSet.LEFT,0);
set.connect(leftButton.getId(),ConstraintSet.TOP,layout.getId(),ConstraintSet.TOP,0);
set.connect(leftButton.getId(),ConstraintSet.BOTTOM,layout.getId(),ConstraintSet.BOTTOM,0);
set.connect(rightButton.getId(),ConstraintSet.LEFT,rightButton.getId(),ConstraintSet.RIGHT,0);
set.connect(rightButton.getId(),ConstraintSet.RIGHT,layout.getId(),ConstraintSet.RIGHT,0);
set.connect(rightButton.getId(),ConstraintSet.TOP,layout.getId(),ConstraintSet.TOP,0);
set.connect(rightButton.getId(),ConstraintSet.BOTTOM,layout.getId(),ConstraintSet.BOTTOM,0);
set.applyTo(layout);
这是上面代码的截图:programmatically created。
下面是一些描述相同内容并且工作正常的xml,供参考:
<ImageButton
android:layout_
android:layout_
android:id="@+id/right_button"
app:layout_constraintLeft_toRightOf="@+id/left_button"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<ImageButton
android:layout_
android:layout_
android:id="@+id/left_button"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/right_button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
这里是xml的截图:manually created
【问题讨论】:
【参考方案1】:您正在做的事情有几个问题。首先,您将相同的 LayoutParams 实例分配给两个对象——这是行不通的。你需要一个单独的实例:
ConstraintLayout.LayoutParams anySizeParams2 = new ConstraintLayout.LayoutParams(0, 0);
rightButton.setLayoutParams(anySizeParams2);
其次,你弄错了连接:
set.connect(rightButton.getId(),ConstraintSet.LEFT,
rightButton.getId(),ConstraintSet.RIGHT,0);
应该是:
set.connect(rightButton.getId(),ConstraintSet.LEFT,
leftButton.getId(),ConstraintSet.RIGHT,0);
否则它不会创建一个链。
在添加视图之后克隆布局可能会更干净。
【讨论】:
我刚试过,结果还是空白。这真的对你有用吗?以上是关于使用 ConstraintLayout 以编程方式连接设置为任意大小的多个视图的主要内容,如果未能解决你的问题,请参考以下文章
在ConstraintLayout中为CardView设置约束参数
使用 ConstraintSet 以编程方式将 Button 添加到 ConstrainLayout
约束布局中以编程方式添加的按钮将忽略约束 - Android