본문 바로가기
Android/Java

[Android / Java] Layout: 화면에 뷰를 수놓는 방법

by ghan2 2024. 6. 3.

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

https://medium.com/depayse/android-layout1-viewgroup-333c9fb1b1cf

 

# 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 : 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 값을 가진다.

layout 속성

 

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). 될 때까지 안드로이드. 루비페이퍼