본문 바로가기

책 요약하기/코틀린을 활용한 안드로이드 프로그래밍

#5. 레이아웃 익히기 2021-01-29

- 요약 -

1. 5개 레이아웃의 계층도는 다음과 같다.

java.lang.Object
android.view.View
android.widget.ViewGroup
LinearLayout RelativeLayout GridLayout FrameLayout
android.widget.LinearLayout
android.widget.TableLayout

2. 리니어레이아웃의 주요 속성은 다음과 같다

  • orientation : 레이아웃 안에 배치할 위젯의 수직 또는 수평 방향을 설정한다.
  • gravity : 레이아웃 안에 배치할 위젯의 정렬 방향을 좌측, 우측, 중앙 등으로 설정한다.
  • padding : 레이아웃 안에 배치할 위젯의 여백을 설정한다.
  • layout_weight : 레이아웃이 전체 화면에서 차지하는 공간의 가중값을 설정한다.
  • baselineAligned : 레이아웃 안에 배치할 위젯을 보기 좋게 정렬한다.

3. 렐러티브레이아웃 안의 위젯 속성 중에서 부모(레이아웃)의 어느 위치에 배치할지를 결정하는 속성에는 layout_alignParentBottom을 비롯해 일곱 가지가 있다. 또한 다른 위젯의 특정한 곳에 배치하는 속성에는 layout_above를 비롯해 아홉 가지가 있다.

4. 테이블레이아웃은 위젯을 표 형태로 배치할 때 주로 사용하며 행의 수는 <TableRow>로 결정된다. 테이블레이아웃에서 설정하는 속성에는 layout_span, layout_column, stretchColumns가 있고, 테이블레이아웃 안의 위젯에 설정하는 속성은 layout_span, layout_column이다.

5. 그리드레이아웃은 테이블레이아웃보다 좀 더 직관적으로 구성할 수 있으며, 행 단위의 확장도 가능하여 다양한 형태의 표를 만들 수 있다.

6. 프레임레이아웃은 레이아웃 안의 위젯을 왼쪽 상단부터 겹쳐서 출력해준다.

 

- 연습문제 -

1. 레이아웃의 다섯 가지 종류에 대해 간략히 설명하시오.

LinearLayout 위젯을 수평, 수직 방향으로 차례대로 배치하는 방식의 레이아웃
RelativeLayout 레이아웃의 특정 위치를 지정하여 배치하거나 다른 위젯의 상대적인 위치를 지정하는 레이아웃
GridLayout 테이블 레이아웃과 비슷하며 행 또는 열을 확장하여 다양하게 배치 가능한 레이아웃
TableLayout 행과 열의 개수를 지정한 테이블 형태로 위젯을 배열하는 레이아웃
FrameLayout 여러개의 위젯을 배치한 후 상황에 따라서 필요한 위젯을 보이는 방식에 주로 활용되는 레이아웃

 

2. gravity 속성과 layout_gravity 속성의 차이를 간략히 설명하시오.

gravity 자신에게 포함된 자식(위젯, 레이아웃 등)을 어디에 위치시킬지 결정
layout_gravity 자신의 위치를 부모(레이아웃 등)의 어디에 위치시킬지 결정

 

3. 렐러티브레이아웃에서 위젯의 배치를 위해 설정할 수 있는 XML 속성에 대해 설명하시오.

XML 속성 레이아웃 기준 XML 속성 특정 위젯 기준
layout_alignParentLeft 왼쪽 toLeftOf 왼쪽방향
layout_alignParentRight 오른쪽 toRightOf 오른쪽방향
layout_alignParentTop 상단 above 위방향
layout_alignParentBottom 하단 below 아래방향
layout_centerVatical 중간(수직방향) alignTop 상단
layout_centerInParent 정중앙 alignBaseline 중간(수직방향)
layout_centerHorizontal 중간(수평방향) alignBottom 하단
    alignLeft 중간(수평방향) 기준 왼쪽
    alignRight 중간(수평방향) 기준 오른쪽

 

4. 오른쪽 화면을 XML 파일로 만드시오. 단, 리니어레이아웃만 사용하고 각 레이아웃의 색상을 다르게 설정한다.

1) 먼저 하늘색 바탕색의 레이아웃과 빈 레이아웃(수평설정)을 생성합니다

 

2)  빈 레이아웃 안에 검정색 바탕색(수직설정)의 레이아웃과 또다른 빈 레이아웃(수평설정)을 생성합니다.

 

 

3) 또 다른 빈 레이아웃 안에 3가지 색상의 레이아웃을 추가 해 줍니다.

 

4) 마지막으로 검정색 바탕색의 레이아웃에 색깔을 없개고, 두개의 레이아웃(검정색, 노란색)을 추가해 줍니다.

 

 

5. 오른쪽 화면을 XML 파일로 만드시오. 단, 렐러티브레이아웃에 버튼을 사용하고 중앙에 있는 <기준 위젯>의 상대적인 위치로 다른 위젯을 배치한다. <기준 위젯>의 크기는 가로세로 150dp이다.

(기준위젯, 1번, 2번)

(3번, 4번, 5번, 6번)

 

 

6. 다음 화면을 프로젝트로 완성하시오. 리니어레이아웃을 이용하여 XMl 코드로 만들고, 각 레이아웃을 클릭하면 레이아웃의 너비와 높이가 토스트 메시지로 출력되도록 Kotlin으로 프로그래밍한다. (안쪽 레이아웃은 모두 정사각형이며, 크기는 안쪽 레이아웃부터 50dp, 150dp, 250dp이다. 각 레이아웃의 색상을 다르게 한다.)

 

 

[activity_main.xml]

 

[MainActivity.kt]

이하 생략(변수 이름만 다르고 나머지는 같습니다 :))

 

3개의 정사각형 모양의 레이아웃을 눌러 봤는데 계산하면서 약간의 오차는 있는것 같습니다. (실제 250dp, 150dp, 50dp)

 

★화면 해상도 계산법

getWidth(), getHeigth()는 px값을 반환합니다.
px = dp x dpi /160
dp = px * 160 / dpi

[dpi]
hdpi : 240dpi
xhdpi : 320dpi
xxhdpi : 480dpi
xxxhdpi : 640dpi

 

dpi확인은 [Tools] - [AVD Manager]를 확인해 보면 됩니다.

 

dpi가 441이라고 나와있는데 실제로 AVD 전체 레이아웃을 클릭해보면 441이 나옵니다.

 

7. 다음 화면을 프로젝트로 완성하시오. XML파일 없이 Kotlin 코드만 이용하고 각 레이아웃의 색상을 다르게 한다.

XML파일 없이 Kotlin으로 코딩

(하는중.... 혹시 하신분이 있다면 댓글 부탁드립니다.)

(레이아웃 중첩부분이 잘 안되네요....:(()