ConstraintLayoutコードでの制約の動的設定


ConstraintLayoutの普及によりAndroidの開発者たちはレイアウトを容易にすることができますが、コードにConstraintLayoutの制約をどのように設定すればいいのでしょうか.ネット上の資料はあまり詳しくないので、ここでまとめてみます. 
ConstraintSet
このクラスは公式ドキュメントで次のように記述されています.
This class allows you to define programmatically a set of constraints to be used with ConstraintLayout.
For details about Constraint behaviour see ConstraintLayout. It lets you create and save constraints, and apply them to an existing ConstraintLayout. ConstraintsSet can be created in various ways:
  • Manually  c = new ConstraintSet(); c.connect(....);
  • from a R.layout.* object  c.clone(context, R.layout.layout1);
  • from a ConstraintLayout  c.clone(clayout);

  • これにより、コードでConstraintLayoutとともに使用する制約を定義できます.このクラスを使用する方法は非常に簡単です.このクラスを新規作成し、このクラスを操作する必要があります.
       c = new ConstraintSet(); c.connect(....);
    または、レイアウトコンストレイントを最初にクローン化してから、このレイアウトコンストレイントのクローンを操作します.c.clone(context, R.layout.layout1); c.clone(clayout);
    ここで注意しなければならないのは、クローン化されたレイアウトコンストレイントが「クローン化」されていることです.その後、このクローンコンストレイントに対する変更は、前のコンストレイントの上に作成されます.前のコンストレイントを空にする場合は、
       c.clear(int viewId)
     
    戻る前にConstraaintSetをクローン化したり作成したりした後、このオブジェクトをどのように設定すればいいのでしょうか.たとえば、textViewの右境界を親コンテナ全体の右境界に整列させたい場合は、次のように書くことができます.
    c.connect(textView.getId(),ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT);

    右の境界に間隔を追加したい場合は?次のように書くことができます.
       c.connect(textView.getId(),ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,10);

    この時、私はその上の境界コンストレイントをbuttonの下の境界に位置合わせしたいと思っていますか?
       c.connect(textView.getId(),ConstraintSet.TOP,button.getId(),ConstraintSet.BOTTOM);

    この方法を振り返ってみましょう.connect(int startID, int startSide, int endID, int endSide, int margin)
    startIDはあなたが制約するコントロールIDで、startSideは彼が制約する境界で、endIDはあなたの制約条件コントロールのIDで、endSideはその境界で、marginは自然に間隔です.xmlにおけるConstraintLayoutの制約とは異なり、ConstraintSetの制約操作はこの方法であるconnectのみを使用します.
    同時に、ConstraaintSetはあなたのコントロールの幅を簡単に設定することができて、使用しますconstrainHeight(int viewId, int height) constrainWidth(int viewId, int width)
    この二つの方法でいいです.
    コントロールのコンストレイントを設定すると、コンストレイントをどのように適用しますか?同じように簡単です.
      c.applyTo(mConstraintLayout);
    

    1行のコードだけでできます. 
     
    ConstraintSetの設定方法はまだたくさんありますが、基本的にXMLで定義できるものはすべてあります.ここでは一つ一つ挙げません.最後に公式ドキュメントのアドレスをあげて、ConstraintSetの公式説明をお問い合わせください.