使用
addView()
,可以像在
LinearLayout
中一样将视图添加到
ConstraintLayout
中。不同之处在于,使用
ConstraintLayout
时,添加的视图必须受到限制。要通过编程方式对视图进行约束,请使用
ConstraintSet
。
此类允许您以编程方式定义一组与ConstraintLayout一起使用的约束条件。它使您可以创建和保存约束,并将其应用于现有的ConstraintLayout。
以下是一个简短的示例:
activity_main
定义两个TextViews
。将它们水平居中并位于顶部。
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/topView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Top View"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/bottomView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Bottom View"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/topView" />
</android.support.constraint.ConstraintLayout>
当在该布局中添加一个新的
TextView
(“中间视图”)而没有设置约束时,您将看到的是这个。请注意,新视图默认位置为(0,0)。
假设我们希望生成的中间视图在窗口中水平居中放置在顶部视图和底部视图之间,就像这样:
这里是将产生此结果的代码:
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView middleView = new TextView(this);
middleView.setId(View.generateViewId());
middleView.setText("Middle View");
middleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20.0f);
ConstraintLayout layout = findViewById(R.id.constraintLayout);
ConstraintLayout.LayoutParams lp =
new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT);
layout.addView(middleView, lp);
ConstraintSet set = new ConstraintSet();
set.clone(layout);
int topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
16, getResources().getDisplayMetrics());
set.connect(middleView.getId(), ConstraintSet.TOP, R.id.topView, ConstraintSet.BOTTOM, topMargin);
set.connect(R.id.bottomView, ConstraintSet.TOP, middleView.getId(), ConstraintSet.BOTTOM, topMargin);
set.centerHorizontally(middleView.getId(),ConstraintSet.PARENT_ID);
set.applyTo(layout);
}