Android : How to programmatically set layout_constraintRight_toRightOf "parent"
Asked Answered
T

5

69

I have a view in ConstrainLayout as follows.

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxWidth="260dp"
        android:textColor="#FFF"
        android:textSize="16sp"
        app:layout_constraintLeft_toLeftOf="@+id/parent"
        app:layout_constraintTop_toBottomOf="@id/message_date"
        android:id="@+id/text_main"
        />

I would like to change the view to either app:layout_constraintLeft_toLeftOf="@+id/parent" or layout_constraintLeft_toRightOf="@+id/parent" programmatically in recycleViewHolder based on some conditions.

Torques answered 16/1, 2017 at 6:29 Comment(2)
Possible duplicate of Add view to constraintLayout with constraints similar to another childDivers
@Divers I don't want to add a view, I just want to change alignment. Can you post the relevant part of that answer?Torques
P
98

Here is an example of setting a button to the bottom of parent view using java code:

ConstraintLayout constraintLayout;
ConstraintSet constraintSet;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    constraintLayout = (ConstraintLayout) findViewById(R.id.activity_main_constraint_layout);

    Button button = new Button(this);
    button.setText("Hello");
    constraintLayout.addView(button);

    constraintSet = new ConstraintSet();
    constraintSet.clone(constraintLayout);

    constraintSet.connect(button.getId(), ConstraintSet.LEFT, constraintLayout.getId(), ConstraintSet.RIGHT, 0);
    constraintSet.constrainDefaultHeight(button.getId(), 200);
    constraintSet.applyTo(constraintLayout);

}

to achieve something like this,

app:layout_constraintLeft_toLeftOf="@+id/parent" 

your java code should look like this

set.connect(YOURVIEW.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0);

and to achieve something like this,

layout_constraintLeft_toRightOf="@+id/parent"

your java code should look like this,

set.connect(YOURVIEW.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0);

Here, I'm assuming android:id="@+id/parent" is the id of your parent ConstraintLayout .

Phoenix answered 16/1, 2017 at 8:55 Comment(3)
set.applyTo(layout); doesn't this apply these constraints to the parent instead of the TextView? Should it be ? set.applyTo(button); or something similar?Torques
No the set knows to whom you want to apply the changes now it's time to tell the parent layout, hey please apply this changes. so this should be like set.applyTo(parent).Phoenix
Your code is wrong, first you have to add button in constraint layout then constraintSet.clone(constraintLayout); will be done. Otherwise nothing is done to buttonLermontov
L
17

constraintSet = new ConstraintSet(); and so on

Did not work for me anyhow.

Solved by

  LayoutParams layoutParams = (LayoutParams) viewToChange.getLayoutParams();
    layoutParams.leftToLeft = anotherViewId;
    layoutParams.rightToRight =anotherViewId;
    layoutParams.topToTop = anotherViewId;
    layoutParams.bottomToBottom = anotherViewId;
    layoutParams.startToStart =anotherViewId;
    layoutParams.endToEnd = anotherViewId;
    viewToChange.setLayoutParams(layoutParams);
Lace answered 25/4, 2020 at 10:15 Comment(2)
Does anyone know why in some cases constraint set just doesn't work? It works fine for me when using LayoutParamsGuerrilla
This method work for me - I want to change LinearLayout params and its parent is constrainLayout. ThanksIla
P
6

Use id

class MyLayout(context: Context) : ConstraintLayout(context) {

    fun show() {
        val view = ImageView(context)
        addView(view)
        val params = view.layoutParams as ConstraintLayout.LayoutParams
        params.height = 100 
        params.width = 50
        params.rightToRight = id
        view.requestLayout()
    }
}
Piecrust answered 27/11, 2018 at 13:37 Comment(1)
it returns null from view.layoutParamsEndoskeleton
B
4

I had same situation when I needed to move buttons down once a new EditText appears, In XML file they had constraints like this:

app:layout_constraintTop_toBottomOf="@+id/first_layout"

and what I needed to do is changing to sth like programmatically:

app:layout_constraintTop_toBottomOf="@+id/second_layout"

Using ConstraintLayout.LayoutParams the task is pretty straightforward e.g.

Kotlin:

val currentLayout = btn.layoutParams as ConstraintLayout.LayoutParams // btn is a View here
currentLayout.topToBottom = R.id.second_layout // resource ID of new parent field
btn.layoutParams = currentLayout

and that's it!

Bluepencil answered 8/12, 2020 at 15:12 Comment(0)
B
3

Haven't seen better solution than this:

textMain.updateLayoutParams<ConstraintLayout.LayoutParams> {
    startToEnd = anyOtherView.id
    topToTop = anyOtherView.id
    endToStart = anyOtherView.id
    bottomToBottom = anyOtherView.id
  }
Befitting answered 25/1, 2023 at 9:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.