LoginSignup
8
6

More than 5 years have passed since last update.

ConstraintLayout とは

iOS の AutoLayout のような機能をもったレイアウト (ViewGroup)

AutoLayout との違い

  • Storyboard と違って人間が編集できるレベルの xml
  • レイアウトの機能は一長一短
    • 複数レイアウトをまとめてセンタリングしたりできる (後述)
    • ビューAの右端をビューBの中心に揃えるなどは一工夫必要 (後述)
      • Alignment constraints with different attributes 的なやつ

ConstraintLayout の基本的な使い方

  • 新しめの Android Studio であれば、新規プロジェクトを作成するときに Empty Activity などを選択するとデフォルトで ConstraintLayout が使われるようになっている

  • 基本的には上下左右 (+ 利用可能ならベースライン) 間の制約を設定することでレイアウトを表現

ConstraintLayout でできること

  • 上下 or 左右の両方に制約を設定すると、どこにレイアウトするかを割合で定義することができる

    • デフォルトは 50% なので中央にレイアウトされる
    • 一見単純だが、色々なレイアウトテクニックに使えるので大事
  • View のサイズは、Wrap Content, Match Constraint, Fixed のどれか

    • 従来の match_parent は廃止され 0px + 両端への制約で定義するようになる
    • 縦横どちらかを Match Constraint にすると、アスペクト比でサイズを定義できる
  • Margin はこれまで通りに指定できるが、負の値を指定できない

    • RelativeLayout でも公式にサポートしていたわけではない、というスタンスらしい
    • 実現方法は後述
  • 複数の View をまとめて扱う (チェインさせる) ことができる

    • 以下のいずれか
      • Spread: 適切にスペーシング (両端にもスペースが入る)
      • Spread Inside: 適切にスペーシング (両端にもスペースが入らない)
      • Packed: ひとまとまりの View として扱える
        • bias の定義もできる
    • Spread (Inside) の場合は 1 つ以上の View を Match Constrain にすることで、LinearLayout のように weight を指定することができる
  • Guideline

    • 便利そう
  • Gone Margin

    • 制約の参照先が gone になった場合の margin を定義することができる

ConstraintLayout で難しいこと

  • ビューAの右端をビューBの中心に揃える

    • ビューBの左右の制約をビューAに張れば OK
  • 負の margin を指定するには

    • margin 用の Space を追加するのが best practice
    • 早く公式で対応して欲しいところ
  • [IMO] 既存のレイアウトの自動変換とか Infer Constrains という自動で制約を設定してくれる機能があるけれど、微妙な結果になることがままあるので結局 1 から自分で書くことになるような

ConstraintLayout でできないこと

  • 頭をひねれば割と色々できる
  • 複数のレイアウトから最大/最小のものを参照する、とかは難しそう
    • これについては素直に LinearLayout を使うのが良さそう?
    • 良い方法あれば是非教えてください
8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6