使用的ConstraintLayout版本
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
如果不使用androidx的话可以使用下面的版本
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
注意:使用不同的ConstraintLayout版本可能会有坑,如果在使用过程中发现实现不了想要添加的约束,可以尝试改变ConstraintLayout的版本如上所示。
1. 动态添加View
第一种情况:所有的View都是动态添加
举个例子
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/clRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
android:id="@+id/ivLeft"
android:layout_width="100dp"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:scaleType="centerCrop"
android:src="@drawable/ic_lake"
app:layout_constraintDimensionRatio="h,16:9"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:id="@+id/tvRight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="@string/lake_tahoe_title"
android:textSize="30sp"
app:layout_constraintLeft_toRightOf="@+id/ivLeft"
app:layout_constraintTop_toTopOf="parent" />
android:id="@+id/tvBottom"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="8dp"
android:text="@string/lake_discription"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ivLeft" />
初始布局.jpg
上面的布局文件中呈现的效果如图所示,接下来我们用代码的方式动态添加View,实现上面的效果。
首先在res/values文件夹下新建一个ids.xml,在ids.xml中声明我们要添加的View的控件id。
ids.xml
然后开始写代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
addViewUseLayoutParams()
}
使用ConstraintLayout.LayoutParams
private fun addViewUseLayoutParams() {
val constraintLayout = ConstraintLayout(this)
constraintLayout.id = R.id.clRoot
constraintLayout.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
//先设置根布局
setContentView(constraintLayout)
val ivLeft = ImageView(this)
ivLeft.id = R.id.ivLeft
ivLeft.scaleType = ImageView.ScaleType.CENTER_CROP
ivLeft.setImageResource(R.drawable.ic_lake)
val ivLeftLayoutParams: ConstraintLayout.LayoutParams = ConstraintLayout.LayoutParams(
ScreenUtil.dpToPx(this, 100), 0
)
ivLeftLayoutParams.leftToLeft = R.id.clRoot
ivLeftLayoutParams.marginStart = ScreenUtil.dpToPx(this, 8)
ivLeftLayoutParams.topToTop = R.id.clRoot
ivLeftLayoutParams.topMargin = ScreenUtil.dpToPx(this, 8)
ivLeftLayoutParams.dimensionRatio = "h,16:9"
ivLeft.layoutParams = ivLe