Android Studio如何动态设置约束和使用LayoutParams
Android Studio How To Set Constraints And Use LayoutParams Dynamically
在我的 Android 应用程序中,我想创建一堆 ConstraintLayouts
,其中每个都有一个 ImageView
和一个 TextView
。
一切都是从代码创建的,除了我将开始的 TableRow
。我的问题是,尽管能够通过 LayoutParams 为 ConstraintLayout
设置边距,但当我尝试设置边距时,ImageView
和 TextView
根本没有改变。
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
}
这不起作用的原因可能是因为我没有设置 ImageView
和 TextView
的约束,但我如何在代码中做到这一点?
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 的很好的教程。
在我的 Android 应用程序中,我想创建一堆 ConstraintLayouts
,其中每个都有一个 ImageView
和一个 TextView
。
一切都是从代码创建的,除了我将开始的 TableRow
。我的问题是,尽管能够通过 LayoutParams 为 ConstraintLayout
设置边距,但当我尝试设置边距时,ImageView
和 TextView
根本没有改变。
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
}
这不起作用的原因可能是因为我没有设置 ImageView
和 TextView
的约束,但我如何在代码中做到这一点?
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 的很好的教程。