Skip to content

Instantly share code, notes, and snippets.

@adavis
Last active March 26, 2024 02:00
Show Gist options
  • Save adavis/18f4f89fa05e9856cf4ff28d086b9994 to your computer and use it in GitHub Desktop.
Save adavis/18f4f89fa05e9856cf4ff28d086b9994 to your computer and use it in GitHub Desktop.
A function to programmatically add views to ConstraintLayout with Flow
class ChipsView<T : Parcelable>(ctx: Context, attr: AttributeSet) : ConstraintLayout(ctx, attr) {
...
private fun addSubviews() {
val flow = Flow(context).apply {
id = generateViewId()
setWrapMode(Flow.WRAP_CHAIN)
setHorizontalStyle(Flow.CHAIN_PACKED)
setHorizontalAlign(Flow.HORIZONTAL_ALIGN_START)
setHorizontalBias(0f)
setVerticalGap(pillMarginWidth)
setHorizontalGap(pillMarginWidth)
setOrientation(Flow.HORIZONTAL)
layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
}
val constraintSet = ConstraintSet().apply {
clone(this@ChipsView)
clear(flow.id, ConstraintSet.END)
clear(flow.id, ConstraintSet.START)
clear(flow.id, ConstraintSet.BOTTOM)
connect(flow.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START)
connect(flow.id, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END)
connect(flow.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM)
}
constraintSet.applyTo(this)
addView(flow)
val referenceIds = IntArray(pills.size)
loop@ for ((index, pill) in pills.withIndex()) {
val textView = pill.asTextView()
referenceIds[index] = textView.id
addView(textView)
}
flow.referencedIds = referenceIds
post { requestLayout() }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment