Установить виджеты ограничений динамически - PullRequest
2 голосов
/ 07 октября 2019

Вы можете легко создать ограничения в макете xml:

example

Однако я не смог сделать то же самое в коде. Может кто-нибудь помочь перенести следующий XML в Java-код?

<TextView
    ...
    android:layout_marginStart="10dp"
    android:layout_marginTop="10dp"
    android:layout_marginEnd="10dp"
    android:layout_marginBottom="10dp"
    app:layout_constraintBottom_toTopOf="@+id/details"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@+id/image"
    app:layout_constraintTop_toTopOf="parent" />

Я пробовал следующий код для установки полей, но он не работает. TextView всегда в одном и том же месте.

ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(textView.getLayoutParams());
layoutParams.setMargins(10,10,10,10);
description.setLayoutParams(layoutParams);

1 Ответ

1 голос
/ 21 октября 2019

Ограничения не являются частью LayoutParams.

То, что вы ищете, это ConstraintSet , установленное в самом ConstraintLayout.

    final ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.clone(constraintLayout);
    constraintSet.connect(R.id.textViewId, ConstraintSet.BOTTOM, R.id.details, ConstraintSet.TOP,10 /*"DP"*/);
    constraintSet.connect(R.id.textViewId, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END,10 /*"DP"*/);
    constraintSet.connect(R.id.textViewId, ConstraintSet.START, R.id.image, ConstraintSet.END,10 /*"DP"*/);
    constraintSet.connect(R.id.textViewId, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP,10 /*"DP"*/);
    constraintSet.applyTo(constraintLayout);

Помните, что значение, которое вы передаете в качестве последнего параметра, будет в пикселях, когда в коде, поэтому вам придется преобразовать его в пиксели измерения (DP).

...