Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set ConstraintLayout width to match parent width programmatically

In an android application I am attempting to programmatically add customized ConstraintLayout views to a vertically oriented LinearLayout.

I set the LayoutParams to MATCH_PARENT for width and WRAP_CONTENT for height in the ConstraintLayouts. However, when I run the application the ConstraintView is all scrunched up and the content is overlapping. Below are some relevant snippets and a screenshot of my application. How do I go about correcting this issue?

public class ItemView extends ConstraintLayout {
    LinearLayout linearButtons;
    LinearLayout linearText;
public ItemView(Context context, String name, String price, ArrayList<String> guests, 
   ArrayList<String> checked, int id) {
...
    addView(linearText);
    addView(linearButtons);
    set.clone(this);
    set.connect(linearText.getId(), ConstraintSet.LEFT, this.getId(), 
      ConstraintSet.LEFT, 8);
    set.connect(linearText.getId(), ConstraintSet.TOP, this.getId(), 
     ConstraintSet.TOP, 8);
    set.connect(linearButtons.getId(), ConstraintSet.RIGHT, this.getId(), 
     ConstraintSet.RIGHT, 8);
    set.connect(linearButtons.getId(), ConstraintSet.TOP, this.getId(), 
     ConstraintSet.TOP, 8);
}

elsewhere:

for (Item it:r.getItems()) {
        ItemView itemView = new ItemView(this, it.getName(), nf.format(it.getPrice()), dinerlist, it.getGuests(), i);
        ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT);
        itemView.setLayoutParams(params);
        vg.addV[enter image description here][1]iew(itemView);
        Log.d("ItemView Children: ", itemView.getWidth()+" "+itemView.getHeight());
like image 420
kervox Avatar asked May 29 '17 19:05

kervox


1 Answers

In ConstraintLayout in xml when you want a "MATCH_PARENT" width, you have to set the width to 0dp and then set the layout_constraintWidth_default attribute to "spread"

Programmatically you can do the same:

a) set a 0 dp width and height

b) set defaultWidth and defaultHeight constraints

    //add the view with 0dp width and height
    val layoutParams = ConstraintLayout.LayoutParams(0, 0)
    val view = View(context)
    view.layoutParams = layoutParams
    view.id = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) View.generateViewId() else R.id.yourLayoutId
    parent.addView(view)

    //apply the default width and height constraints in code
    val constraints = ConstraintSet()
    constraints.clone(parent)
    constraints.constrainDefaultHeight(view.id, ConstraintSet.MATCH_CONSTRAINT_SPREAD)
    constraints.constrainDefaultWidth(view.id, ConstraintSet.MATCH_CONSTRAINT_SPREAD)
    constraints.applyTo(parent)

If you need Java:

    //add the view with 0dp width and height
    ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(0, 0);
    View view = View(context);
    view.setLayoutParams(layoutParams);
    view.setId(R.id.yourLayoutId);
    parent.addView(view);

    //apply the default width and height constraints in code
    ConstraintSet constraints = new ConstraintSet();
    constraints.clone(parent);
    constraints.constrainDefaultHeight(view.getId(), ConstraintSet.MATCH_CONSTRAINT_SPREAD);
    constraints.constrainDefaultWidth(view.getId(), ConstraintSet.MATCH_CONSTRAINT_SPREAD);
    constraints.applyTo(parent);
like image 80
Kaskasi Avatar answered Sep 30 '22 17:09

Kaskasi