Is it possible to do weights in Jetpack Compose? For example, I'd like to set it up in such a way that one item is weighted as 1/3 of a layout, and the other takes up the remaining 2/3.
In the XML/ViewGroup style, you can achieve this using LinearLayouts and ConstraintLayouts. To my dismay, however, it doesn't seem possible using Jetpack Compose.
Example:
In ConstraintLayout, this is done as follows:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<View
android:layout_width="0dp"
android:layout_height="100dp"
android:id="@+id/red"
android:background="@color/red"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/blue"
app:layout_constraintHorizontal_weight="1"/>
<View
android:layout_width="0dp"
android:layout_height="100dp"
android:id="@+id/blue"
android:background="@color/blue"
app:layout_constraintStart_toEndOf="@id/red"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_weight="2"/>
</androidx.constraintlayout.widget.ConstraintLayout>
In LinearLayouts, this is done as follows:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="100dp"
android:id="@+id/red"
android:background="@color/red"
android:layout_weight="1"/>
<View
android:layout_width="0dp"
android:layout_height="100dp"
android:id="@+id/blue"
android:background="@color/blue"
android:layout_weight="2"/>
</LinearLayout>
I know that you can use Tables to get evenly distributed things, but I want an uneven distribution.
You can use the Modifier.weight
Something like:
Row() {
Column(
Modifier.weight(1f).background(Blue)){
Text(text = "Weight = 1", color = Color.White)
}
Column(
Modifier.weight(2f).background(Yellow)
) {
Text(text = "Weight = 2")
}
}
Since "0.1.0-dev09" modifiers are moved on an interface, you can use
Modifier.weight(float, boolean)
to divide the vertical/horizontal space remaining after measuring unweighted child elements and distribute it according to this weight
Column {
Row(modifier = Modifier.weight(2.0f, true)) {
Box (
modifier = Modifier.fillMaxWidth().fillMaxHeight(),
backgroundColor = Color.Red
)
}
Row(modifier = Modifier.weight(1.0f, true)) {
Box (
modifier = Modifier.fillMaxWidth().fillMaxHeight(),
backgroundColor = Color.Blue,
gravity = ContentGravity.Center
) {
Text(text = "A sample text")
}
}
Row(modifier = Modifier.weight(2.0f, true)) {
Box (
modifier = Modifier.fillMaxWidth().fillMaxHeight(),
backgroundColor = Color.Yellow
)
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With