Search code examples
androidandroid-layoutandroid-constraintlayout

How to add different weight to ConstraintLayout views


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?


Solution

  • 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);