How to add different weight to ConstraintLayout views

Prashant Jajal picture Prashant Jajal · Feb 8, 2018 · Viewed 30.8k times · Source

In my layout, I have a ConstraintLayout containing two TextView elements. They are currently the same size, but I would like them to have different weights with a 6:4 ratio.

How can this be achieved in my ConstraintLayout?

Answer

Ben P. picture Ben P. · Feb 8, 2018

In XML

Create a horizontal chain, and then use the app:layout_constraintHorizontal_weight attribute:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/one"
        android:layout_width="0dp"
        android:layout_height="48dp"
        android:background="#caf"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/two"
        app:layout_constraintHorizontal_weight="6"/>

    <TextView
        android:id="@+id/two"
        android:layout_width="0dp"
        android:layout_height="48dp"
        android:background="#fac"
        app:layout_constraintLeft_toRightOf="@+id/one"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintHorizontal_weight="4"/>

</android.support.constraint.ConstraintLayout>

enter image description here

In Java

Create your views and add them to the parent ConstraintLayout. You will need to give them each an id in order for everything to work; you can use View.generateViewId() or you can define an id resource for them.

// this will be MATCH_CONSTRAINTS width and 48dp height
int height = (int) (getResources().getDisplayMetrics().density * 48);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(0, height);

View left = new View(this);
left.setId(R.id.one);
parent.addView(left, params);

View right = new View(this);
right.setId(R.id.two);
parent.addView(right, params);

Then create a ConstraintSet object and create your chain:

ConstraintSet set = new ConstraintSet();
set.clone(parent);

int[] chainIds = { R.id.one, R.id.two }; // the ids you set on your views above
float[] weights = { 6, 4 };
set.createHorizontalChain(ConstraintSet.PARENT_ID, ConstraintSet.LEFT,
                          ConstraintSet.PARENT_ID, ConstraintSet.RIGHT,
                          chainIds, weights, ConstraintSet.CHAIN_SPREAD);

set.applyTo(parent);