Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

set percent width constraintlayout Android programmatically

For constraint layout v1.1.x in Android we can set height and width as percentage. Similarly, need to set view width and height as percent in Android programmatically: for example, this code is written in xml for some constraint layout:

<!-- the widget will take 40% of the available space -->
    app:layout_constraintWidth_default="percent"
    app:layout_constraintWidth_percent="0.4"

what will be its java code for doing it runtime?

like image 488
ghufranne Avatar asked Jul 19 '18 10:07

ghufranne


3 Answers

I found the answers above helpful, but still a little confusing. Here's what ultimately worked for me. There are 2 views involved in this example, a parent Constraint View and a child of the Constraint View.

// Get the constraint layout of the parent constraint view.
ConstraintLayout mConstraintLayout = findViewById(R.id.parentView);

// Define a constraint set that will be used to modify the constraint layout parameters of the child.
ConstraintSet mConstraintSet = new ConstraintSet();

// Start with a copy the original constraints.
mConstraintSet.clone(mConstraintLayout);

// Define new constraints for the child (or multiple children as the case may be).
mConstraintSet.constrainPercentWidth(R.id.childView, 0.5F);
mConstraintSet.constrainPercentHeight(R.id.childView, 0.7F);

// Apply the constraints for the child view to the parent layout.
mConstraintSet.applyTo(mConstraintLayout);

Note that for some reason, a percentage constraint of 1.0F doesn't work, although 0.99F works just fine.

like image 129
WavyGravy Avatar answered Nov 15 '22 15:11

WavyGravy


You need to use ConstraintSet - Reference

This class allows you to define programmatically a set of constraints to be used with ConstraintLayout. It lets you create and save constraints, and apply them to an existing ConstraintLayout. ConstraintsSet can be created in various ways:

mConstraintLayout = (ConstraintLayout) findViewById(R.id.myconstraint_layout)

ConstraintSet set = new ConstraintSet();

// Add constrains - Here R.id.myconstraint_layout is the Id of your constraint layout
set.constrainPercentHeight(R.id.myconstraint_layout, 0.4);
set.constrainPercentWidth(R.id.myconstraint_layout, 0.4);

// Apply the changes - mConstraintLayout is reference to the desired view
set.applyTo(mConstraintLayout); 

You can call those height width percentage methods on this set

  • constrainPercentHeight(int viewId, float percent)
  • constrainPercentWidth(int viewId, float percent)

And apply those constraints to your Constraint Layout like this

set.applyTo(mConstraintLayout); 
like image 21
adityakamble49 Avatar answered Nov 15 '22 14:11

adityakamble49


Not sure if this is better or worse, but there is another way to do this than the proposed answer:

Kotlin:

(myView.layoutParams as ConstraintLayout.LayoutParams)
    .matchConstraintPercentWidth = value
myView.requestLayout()

Java:

(myView.layoutParams (ConstraintLayout.LayoutParams))
    .matchConstraintPercentWidth = value
myView.requestLayout()
like image 27
Benjamin Basmaci Avatar answered Nov 15 '22 14:11

Benjamin Basmaci