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 を使うのが良さそう?
- 良い方法あれば是非教えてください