Android Studio如何动态设置约束和使用LayoutParams

Android Studio How To Set Constraints And Use LayoutParams Dynamically

在我的 Android 应用程序中,我想创建一堆 ConstraintLayouts,其中每个都有一个 ImageView 和一个 TextView

一切都是从代码创建的,除了我将开始的 TableRow。我的问题是,尽管能够通过 LayoutParams 为 ConstraintLayout 设置边距,但当我尝试设置边距时,ImageViewTextView 根本没有改变。

public fun generateAsset(tableRow: TableRow) {
    // <android.support.constraint.ConstraintLayout
    //     android:layout_margin="4dp"
    //     android:background="@drawable/x32_tile_dark">

    val clayout = ConstraintLayout(context)
    tableRow.addView(clayout)
    val cparams = clayout.layoutParams as TableRow.LayoutParams
    cparams.setMargins(4, 4, 4, 4) // <--- Works correctly!
    clayout.layoutParams = cparams
    clayout.setBackgroundResource(R.drawable.x32_tile_dark)

    // <ImageView
    //     android:layout_width="0dp"
    //     android:layout_height="60dp"
    //     android:layout_marginTop="8dp"
    //     app:srcCompat="@drawable/x256_spaceship_door_gray_blue" />

    val iView = ImageView(context)
    clayout.addView(iView)
    val iparams = iView.layoutParams as ConstraintLayout.LayoutParams
    iparams.width = ConstraintLayout.LayoutParams.MATCH_PARENT
    iparams.height = 200
    iparams.setMargins(8, 8, 8, 8) // <--- Does not do anything!
    iView.layoutParams = iparams
    iView.setImageResource(R.drawable.x256_spaceship_door_gray_blue)

    // <TextView
    //     android:text="Massive Spaceship Door"
    //     android:layout_marginLeft="8dp"
    //     android:layout_marginRight="8dp"
    //     android:layout_marginBottom="4dp"
    //     android:textColor="@android:color/white" />

    val ntext = TextView(context)
    clayout.addView(ntext)
    val nparams = ntext.layoutParams as ConstraintLayout.LayoutParams
    nparams.setMargins(8, 8, 8, 8) // <--- Does not do anything!
    ntext.layoutParams = nparams
    ntext.setTextColor(Color.WHITE)
    ntext.text = assetName
}

这不起作用的原因可能是因为我没有设置 ImageViewTextView 的约束,但我如何在代码中做到这一点?

ImageView 应该在 ConstraintLayout 的正中央,而 TextView 应该在中央但在底部。

如何设置约束以执行上述操作?

这里不是 100% 确定,但我有一个建议,相信你必须打电话给
iView .updateMargins<ConstraintLayout.LayoutParama>{//do some stuff here}.

你可能会问 "Why?"。
好吧,我认为这是因为您已经创建了 val clayout = ConstraintLayout(context) 但没有指定它具有哪些 attributesSet,因此采用了默认值。并且由于您的视图已经具有 defaultParams,因此现在需要对其进行更新。

但是请做一些独立的研究或者请教真正有知识的专家。因为我不是很确定,这只是一些建议。

您怀疑未设置约束可能是问题所在,这是正确的。要以编程方式设置约束,请查看 ConstraintSet.

This class allows you to define programmatically a set of constraints to be used with ConstraintLayout. It lets you create and save constraints, and apply them to an existing ConstraintLayout.

作为额外的好处,ConstraintSet 允许在设置约束时设置边距。

网上有一些关于如何使用 ConstraintSet 的很好的教程。