요약
| 레이아웃 종류 | 배치 방식 | 핵심 속성 |
|---|
| LinearLayout | 가로 또는 세로 방향으로 순서대로 나열 | orientation(방향), layout_weight(여백), gravity(정렬) |
| RelativeLayout | 다른 뷰의 상대적 위치를 기준으로 배치 | layout_above/below/toLeftOf/toRightOf
layout_/align*/alignParent* |
| FrameLayout | 위에 겹쳐서 배치 | visibility(View.VISIBLE/INVISIBLE/GONE) |
| TableLayout | 표 형태로 배치 (열 병합 가능) | <TableRow>, layout_span/column, stretchColumns |
| GridLayout | 표 형태로 배치 (행/열 병합 가능) | rowCount, columnCount, layout_row/column/*Span |
| ConstraintLayout | 제약 조건으로 계층 구조 배치 | constraint, margin |
1. Layout 개요
- Layout
- 레이아웃은 화면을 독자적으로 출력하지 않고 다른 뷰 객체를 포함하는 그릇 역할
ViewGroup 클래스로부터 상속받으며,
- 내부에 버튼·텍스트뷰·에디트텍스트 등 위젯을 담음
- 레이아웃 클래스마다 뷰를 배치하는 규칙이 존재
2. LinearLayout (선형 배치)
2.1. 기본 규칙
orientation 속성으로 방향 지정: horizontal | vertical
android:orientation="horizontal" 또는 "vertical" 속성
- 뷰를 추가한 순서대로 나열
- 위젯 수가 많아 화면을 벗어나도 자동 줄바꿈 없음
2.2. 중첩 사용
- 레이아웃도 뷰이므로 다른 레이아웃 안에 포함 가능
- 중첩을 활용하면 복잡한 화면 구성 가능
2.3. 여백 채우기: layout_weight 속성
- 남은 여백을 가중치 비율로 나누어 차지
layout_weight="1" → 남은 여백 전체를 차지 (혼자일 때)
- 두 뷰에
1과 3을 지정하면 → 여백을 1/4, 3/4 로 분할
- 뷰 크기를
0dp로 설정하고 가중치로만 비율 지정 → 정확한 비율 분할 가능
<!-- 세로로 3등분 예시 -->
<Button android:layout_height="0dp" android:layout_weight="1" />
<Button android:layout_height="0dp" android:layout_weight="1" />
<Button android:layout_height="0dp" android:layout_weight="1" />
- 주의
layout_weight는 같은 레이아웃 내 뷰들 사이에서만 여백을 나눔
- 중첩 레이아웃끼리는 서로 영향 없음
2.4. 뷰 정렬 속성: gravity vs. layout_gravity
| 속성 | 대상 | 설명 |
|---|
gravity | 내부 콘텐츠 | 뷰 안의 텍스트 등 콘텐츠 정렬 |
layout_gravity | 뷰 자신 | 부모 레이아웃 안에서 뷰 자신의 위치 |
- 기본값: left|top
- orientation 방향과 동일한 방향으로
layout_gravity 지정 시 적용 안 됨 → 부모에 gravity="center" 사용
3. RelativeLayout (상대 위치 배치)
- 기본 규칙
- 기준이 되는 뷰의 아이디가 필요:
@+id/기준뷰아이디
- 위치 속성 미사용 시 모든 뷰가 겹쳐서 출력됨
3.1. 상대 뷰 기준 배치 속성
| 속성 | 설명 |
|---|
layout_above | 기준 뷰의 위쪽 |
layout_below | 기준 뷰의 아래쪽 |
layout_toLeftOf | 기준 뷰의 왼쪽 |
layout_toRightOf | 기준 뷰의 오른쪽 |
3.2. 맞춤 정렬 (align) 속성
| 속성 | 설명 |
|---|
layout_alignTop | 기준 뷰와 위쪽 맞춤 |
layout_alignBottom | 기준 뷰와 아래쪽 맞춤 |
layout_alignLeft | 기준 뷰와 왼쪽 맞춤 |
layout_alignRight | 기준 뷰와 오른쪽 맞춤 |
layout_alignBaseline | 기준 뷰와 텍스트 기준선 맞춤 |
3.3. 부모(Parent) 기준 배치 속성
| 속성 | 설명 |
|---|
layout_alignParentTop | 부모 위쪽 맞춤 |
layout_alignParentBottom | 부모 아래쪽 맞춤 |
layout_alignParentLeft | 부모 왼쪽 맞춤 |
layout_alignParentRight | 부모 오른쪽 맞춤 |
layout_centerHorizontal | 부모 가로 중앙 |
layout_centerVertical | 부모 세로 중앙 |
layout_centerInParent | 부모 가로·세로 중앙 |
4. FrameLayout (겹쳐서 배치)
// 버튼 클릭 시 버튼 숨기고 이미지 보여주기
binding.button.visibility = View.INVISIBLE
binding.imageView.visibility = View.VISIBLE
5. TableLayout (표 형태 배치)
<TableRow>와 함께 사용
- 행의 수 =
<TableRow>의 수
- 열의 수 =
<TableRow> 안에 포함된 위젯의 수 (첫 번째 행 기준)
5.1. 주요 속성
| 속성 | 위치 | 설명 |
|---|
layout_span | 위젯 | 현재 셀부터 N개 셀 합치기 (열 병합) |
layout_column | 위젯 | 지정된 열에 위젯 표시 (0부터 시작) |
stretchColumns | TableLayout | 지정 열의 너비 확장 ("*" = 모든 열 동일 크기) |
테이블 레이아웃에 포함된 위젯은 layout_width, layout_height 속성 생략 가능
6. GridLayout (그리드 배치)
- Android 4.0(API 14)부터 지원
- TableLayout보다 직관적이고 자유로움
- 행 확장이 가능하여 유연한 화면 구성에 적합
orientation=vertical → rowCount로 행 수 지정
orientation=horizontal → columnCount로 열 수 지정
6.1. 기본 속성
| 속성 | 설명 |
|---|
orientation | 방향 (horizontal / vertical) |
columnCount | 가로로 나열할 뷰 개수 |
rowCount | 세로로 나열할 뷰 개수 |
layout_row | 뷰가 위치하는 세로 인덱스 (0부터) |
layout_column | 뷰가 위치하는 가로 인덱스 (0부터) |
layout_columnSpan | 가로로 열 병합 |
layout_rowSpan | 세로로 행 병합 |
layout_gravity | 셀 안에서 뷰 정렬 (fill, fill_horizontal, fill_vertical 등) |
7. ConstraintLayout (계층 구조 배치)
androidx에서 제공하는 라이브러리
- 레이아웃 편집기(GUI) 환경에서 주로 사용
- RelativeLayout과 비슷하나 더 많은 속성 제공
7.1. 핵심 규칙
- 위젯의 좌우 중 하나, 상하 중 하나는 반드시 다른 뷰와 연결
7.2. 레이아웃 편집기 구성 요소
| 번호 | 이름 | 설명 |
|---|
| 1 | Palette | 뷰 선택 도구 |
| 2 | Component Tree | 뷰 계층 구조 |
| 3 | Toolbar | 도구 모음 |
| 4 | Design Editor | 화면 배치 편집 |
| 5 | Attributes | 속성 설정 |
| 6 | View Mode | 보기 모드 전환 |
| 7 | Zoom/Pan | 화면 조절 |