안드로이드에서 화면에 보이는 모든 것은 뷰라고 배웠다. 뷰그룹은 뷰를 포함할 수 있는 뷰를 말한다. 대표적인 뷰그룹으로는 LinearLayout, RelativeLayout, FrameLayout과 최근에 추가된 ConstraintLayout이 있다. 뷰그룹 또한 뷰이므로 클릭도 되고 색상도 변경할 수 있다.

# LinearLayout (선형 레이아웃)
가장 많이 사용되는 뷰그룹이다. 수평 또는 수직으로 자식 View를 배치할 수 있다. 그리고 자식 뷰끼리는 서로 겹칠 수 없다는 특징이 있다. 가중치 속성으로 다양한 크기의 기기를 지원할 수 있다!
1.1 orientation 속성
자식 뷰들을 배치할 방향을 결정한다. 수평과 수직 두 가지 방법으로 자식 뷰를 배치할 수 있다. 뷰그룹도 뷰이기 때문에 다른 뷰그룹 안에 들어갈 수도 있다.
- android:orientation="vertical" 세로로 자식 뷰를 배치한다
- android:orientation="horizontal" rkfh로 자식 뷰를 배치한다 (기본값)
1.2 layout_weight 속성
LinearLayout의 꽃, 가중치 속성이다. 레이아웃에 포함된 자식 뷰들은 가로나 세로값에 가중치를 가질 수 있다. 가중치가 적용될 가로나 세로면을 0dp로 고정하고, layout_weight 속성에 얼마큼 가중치를 줄지 숫자를 적용한다. 예를 들어 1 : 2 : 1의 비율로 텍스트뷰를 배치한다면 이런 배치가 된다.
- android:layout_height="0dp"
- android:layout_weight="1" // 1 : 2 : 1의 비율로 배치

이 때, 가중치 1만 하나의 뷰에 위치한다면 -> 1 : 0 : 0 으로 자동 배치된다.
💡가중치가 0이라는 것은?
가중치가 0이라는 의미는 본래 자기 크기를 유지하겠다는 의미이다.
1.3 gravity 속성
LinearLayout에 포함된 자식 뷰들의 정렬 방향을 지정하려면 gravity 또는 layout_gravity 속성을 사용한다.
- start, end, top, bottom, center, centerHorizontal, centerVertical 등의 값을 지정할 수 있다.
- 자식 뷰들의 중력을 결정한다. 화면에서 어느 쪽으로 정렬되는가를 말한다.
- | (파이프라인) 기호와 연결하여 여러 속성을 동시에 지정할 수 있다.
- 부모 뷰에서 속성을 지정한다.
💡layout_gravity의 경우에는 자식 뷰에서 속성을 정의한다!
# RelativeLayout (상대 레이아웃)
자식 뷰들을 상대적인 위치에 표시하는 뷰그룹이다. 예를 들어 "Button을 TextView 아래에 놓겠다" 와 같은 규칙을 정의할 수 있다.
2.1 부모 뷰를 기준으로 배치
자식 뷰들이 부모 뷰를 기준으로 어떻게 정리되는지를 결정할 때에는 다음과 같은 속성을 사용하고 모두 boolean 값을 가진다.

2.2 특정 뷰를 기준으로 배치
부모 이외에도 id를 가진 뷰가 있을 때 그 뷰를 기준으로 위치를 결정하는 기능을 제공한다.
- layout_above="@id/[아이디]" : 아이디의 위쪽에 정렬한다.
- layout_toRightOf="@id/[아이디]" : 아이디의 오른쪽에 정렬한다.
- layout_toEndOf="@id/[아이디]" : 아이디의 끝에 정렬한다.
- layout_toLeftOf="@id/[아이디]" : 아이디의 왼쪽에 정렬한다.
- layout_toStartOf="@id/[아이디]" : 아이디의 시작 부분에 정렬한다.
- layout_below="@id/[아이디]" : 아이디의 아래쪽에 정렬한다.
# FrameLayout (프레임 레이아웃)
프레임 레이아웃은 여러 뷰를 포함하면 화면에 배치하기가 어렵다. 따라서 일반적으로 하나의 뷰를 포함하도록 해야 한다. 만약, 여러 뷰를 포함할 때는 RelativeLayout과 마찬가지로 자식 뷰끼리 중첩할 수 있으며, 자식 뷰들은 Layout_gravity 속성으로 자신의 위치를 결정할 수 있다.
- 뷰가 겹치게 된다.
- 뷰는 정의한 순서대로 쌓이게 된다.
# ConstraintLayout (제약 레이아웃)
제약 레이아웃은 크고 복잡한 레이아웃을 평평한 뷰 계층으로 만들 수 있는 레이아웃이다. 뷰 간의 형제 관계, 부모 관계를 제약으로 설정하는 측면에서 RelativeLayout과 비슷해 보이지만, 좀 더 유연하고 안드로이드 스튜디오에서 사용하기도 쉽다. ConstraintLayout은 XML 코드로 직접 작성하지 않고도 레이아웃 에디터에서 배치 작업을 할 수 있다. 이는 안드로이드 2.3 이상에서 사용 가능하다.
참고
오준석. (2018). 될 때까지 안드로이드. 루비페이퍼
'Android > Java' 카테고리의 다른 글
| [Android / Java] 보호 번호 입력창 만들기 (0) | 2024.06.07 |
|---|---|
| [Android / Java] CustomView로 재사용성 높이기 (0) | 2024.06.05 |
| [Android / Java] 색상 자료화 (0) | 2024.06.04 |
| [Android / Java] 안드로이드의 4대 구성요소 (0) | 2024.06.03 |
| [Android / Java] 덧셈 계산기 만들기 (2) | 2024.05.30 |