便利なConstraintLayoutだが、コードからマージンを変更するにはどうすればいいか。
簡単なサンプルを使って確認してみる。
 
このようなボタン配置があったとする。
Screenshot_1534752653
ちなみにレイアウトファイルはこうだ。
<?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"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/constraint_change_root_layout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".ConstraintChangeActivity">

  <Button
    android:id="@+id/constraint_change_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:text="Button"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
このボタンの左側のマージンをコードから100に変更する。
onCreate()を以下のように記述する。
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_constraint_change)

    // 新しい制約をコピーとして作成する
    val constraintSet = ConstraintSet()
    constraintSet.clone(constraint_change_root_layout)

    // マージンのpxをdpに変換する
    val metrics = resources.displayMetrics
    val newMargin = (100 * metrics.density).toInt()

    // 左側のマージンを設定する
    constraintSet.connect(constraint_change_button.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, newMargin)

    // 変更を適用する
    constraintSet.applyTo(constraint_change_root_layout)
  }

constraintSet.connect()が肝となる箇所だ。
メソッド名からすると新しく追加するような連想をしてしまうが、恐らくこれで大丈夫だ。
実行結果はこうなる。
Screenshot_1534754835
期待通りの結果を得る事が出来た!