How can we add Views dynamically in androidx.constraintlayout.helper.widget.Flow
and add reference Ids dynamically.
Asked
Active
Viewed 6,091 times
15

Tamir Abutbul
- 7,301
- 7
- 25
- 53

Dev Soni
- 489
- 4
- 12
-
Here is my other answer: https://stackoverflow.com/questions/61487630/is-there-any-way-of-using-constraintlayouts-flow-helper-widget-programmatically/61545990#61545990 – user2424380 Aug 04 '23 at 16:52
3 Answers
12
You should add first your view (with an id set) to the parent ConstraintLayout
. Then you can add it's reference id to your Flow
with Flow.addView()
. For example:
val view = LayoutInflater.from(context).inflate(R.layout.item, this, false)
view.layoutParams = ConstraintLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
view.id = View.generateViewId()
constraintLayout.addView(view)
flow.addView(view)
with this xml as your ViewGroup:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/constraintLayout"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<androidx.constraintlayout.helper.widget.Flow
android:id="@+id/flow"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:flow_wrapMode="chain"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

Visttux
- 136
- 6
-
1If the app is targeted lower than API level 17, it's possible to use `ViewCompat.generateViewId()` instead of `View.generateViewId()` – Alireza Noorali Jul 03 '21 at 09:27
-
1
6
Here is Kotlin Implementation
for (i in 0..4) {
val customView = CustomComponent (this)
customView.id = generateViewId()
constraintLayout.addView(customView,i)
flow.addView(customView)
}
Following is my XML
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/constraintLayout"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
>
<androidx.constraintlayout.helper.widget.Flow
android:id="@+id/flow"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:flow_wrapMode="chain"
app:flow_horizontalGap="2dp"
app:flow_verticalGap="2dp"
app:flow_verticalStyle = "spread_inside"
app:flow_horizontalStyle="packed"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Following is my Custom View
class CustomComponent @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0,
defStyleRes: Int = 0):LinearLayout(context, attrs, defStyle, defStyleRes) {
init {
LayoutInflater.from(context)
.inflate(R.layout.custom_view, this, true)
}}

angraankit
- 115
- 1
- 11
3
view1.setId(View.generateViewId());
view2.setId(View.generateViewId());
view3.setId(View.generateViewId());
flow.setReferencedIds(new int[]{view1.getId(), view2.getId(), view3.getId()});

Mohammad Alotol
- 1,409
- 15
- 23