레이아웃
- 안드로이드는 다양한 화면 크기를 가지는 장치를 지원하기 때문에 절대적인 화면 위치를 사용하여 뷰를 배치하는 것보다, 상대적으로 뷰를 배치하는 것이 좋다.
- ViewGroup클래스로부터 상속을 받는다. 따라서 ViewGroup 클래스의 메소드와 필드들을 모두 사용할 수 있다.
레이아웃 클래스 |
설명 |
LinearLayout |
자식들을 수직이나 수평으로 배치 |
TableLayout |
자식들을 테이블 형태로 배치 |
GridLayout |
자식들을 바둑판 모양으로 배치 |
RelativeLayout |
자식들을 부모나 다른 자식에 상대적으로 배치 |
TabLayout |
탭을 이용하여서 겹쳐진 자식 중에서 하나를 선택 |
AbsolutLayout |
절대 위치로 배치 |
FrameLayout |
모든 자식들을 좌측 상단에 겹치게 배치 |
선형 레이아웃(linear layout)
- 자식뷰들을 수직이나 수평으로 배치
속성 |
관련 메소드 |
설명 |
orientation |
setOrientation(int) |
"horizontal"은 수평으로, "vertical"은 수직으로 배치한다. |
gravity |
setGravity(int) |
x축과 y축 상에 자식을 어떻게 배치할 것인지를 지정한다. |
baselineAligned |
setBaselineAligned(boolean) |
false로 설정되면 자식뷰들의 기준선을 정렬하지 않는다. |
Gravity 속성
상수 |
값 |
설명 |
top |
0x30 |
객체를 컨테이너의 상단에 배치, 크기를 변경하지 않음 |
bottom |
0x50 |
객체를 컨테이너의 하단에 배치, 크기를 변경하지 않음 |
left |
0x03 |
객체를 컨테이너의 좌측에 배치, 크기를 변경하지 않음 |
right |
0x05 |
객체를 컨테이너의 우측에 배치, 크기를 변경하지 않음 |
center_vertical |
0x10 |
객체를 컨테이너의 수직의 중앙에 배치, 크기를 변경하지 않음 |
fill_vertical |
0x70 |
객체를 컨테이너의 수직을 채우도록 배치 |
center_horizontal |
0x01 |
객체를 컨테이너의 수평을 중앙에 배치, 크기를 변경하지 않음 |
fill_horizontal |
0x07 |
객체를 컨테이너의 수평을 채우도록 배치 |
center |
0x11 |
객체를 컨테이너의 수평, 수직의 중앙에 배치 |
fill |
0x77 |
객체가 컨테이너를 가득 채우도록 배치 |
가중치(layout_weight)
- 선형 레이아웃의 자식 뷰에는 가중치를 부여할 수 있다.
* 화면의 크기에 비례하는 레이아웃을 생성하기 위해서는 컨테이너 객체의 layout_width와 layout_height 속성을 match_parent로 설정한다.
그리고 자식 뷰들의 높이와 너비를 0으로 설정한다. 그런 후에 각 자식 뷰들의 가중치를 상대적으로 주면 화면의 크기에 비례하여 자식의 크기를 결정할 수 있다.
프레임 레이아웃(FrameLayout)
- 프레임 레이아웃 안에서 자식뷰들은 등장하는 순서대로 화면에 표시된다.
- 기준점은 좌측 상단에 된다.
- 만약 자식 뷰가 두개 이상이면 이전에 추가된 자식 위에 새로운 자식이 겹쳐져 그려진다.
- 주로 여러 자식 뷰들을 겹쳐서 배치한 후에 뷰의 가시성(visibility) 속성을 코드로 변경하여 어떤 순간에 하나의 뷰만을 표시하게 할 때 사용한다.
* 가시성(visibility) 속성
속성 |
XML |
코드 |
visible |
android:visibility="visible" |
ImageView01.setVisibility(View.VISIBLE); |
invisible |
android:visibility="invisible" |
ImageView01.setVisibility(View.INVISIBLE); |
테이블 레이아웃(TableLayout)
- 자식 뷰들을 테이블 형태로 배치한다.
- HTML에서 테이블을 표시하는 방법과 비슷하다.
- 하나의 테이블은 여러 개의 TableRow 객체로 이루어지고 하나의 TableRow 안에는 여러 개의 셀(cell)들이 들어간다.
- 만약 각행마다 길이가 다르다면 가장 긴 행의 길이가 테이블의 폭이 된다.
- 테이블 레이아웃에서는 모든 셀들의 너비가 자동으로 결정된다.
- ex) 셀들의 너비를 layout_width로 wrap_content로 설정 하더라도 강제적으로 match_parent로 설정된다.
- 하지만 각 셀들의 높이는 layout_height로 지정할 수 있다.
속성 |
설명 |
stretchColumns |
열 늘림 (속성에 "1"을 넣으면 1번째 열은 내용물에 따라서 늘어남) |
shrinkColumns |
열 축소 |
collapseColumns | 열 감춤 |
상대적 레이아웃(RelativeLayout)
- 자식 부의 위치를 부모 뷰나 다른 자식 뷰들에 상대적으로 지정하는 방법이다.
- 뷰들은 기본적으로 주어진 순서대로 그려지는데 만약 첫 번째 뷰가 화면의 중앙에 위치하고 있다면 그 뷰에 정렬시킨 다른 뷰들은 화면의 중앙에 배치 될 것이다.
- 이러한 순서 때문에 XML을 이용해 레이아웃을 지정한다면 기준이 되는 뷰는 XML 파일에서 먼저 등장하여야 한다.
속성 |
설명 |
layout_above |
만약 true이면 현재 뷰의 하단을 기준 뷰의 위에 일치시킨다. |
layout_below |
현재 뷰의 상단을 기준 뷰의 하단에 위치시킨다. |
layout_centerHorizontal |
수평으로 현재 뷰의 중심을 부모와 일치시킨다. |
layout_centerInParent |
부모의 중심점에 현재 뷰를 위치시킨다. |
layout_centerVertical |
수직으로 현재 뷰의 중심을 부모와 일치시킨다. |
layout_toLeftOf |
현재 뷰의 우측단을 기준 뷰의 좌측단에 위치시킨다. |
layout_toRightOf |
현재 뷰의 좌측단을 기준 뷰의 우측단에 위치시킨다. |
절대적 레이아웃(AbsoluteLayout)
- 절대적인 좌표값을 주어서 뷰들을 배치하는 방법이다.
- 뷰의 속성 layout_x. layout_y에 원하는 좌표값을 지정하면된다.
- 안드로이드 화면 크기가 제각각이기 때문에 많이 사용되지는 않는다.
- 안드로이드에서도 절대적 레이아웃은 권장하지 않는다.
'안드로이드' 카테고리의 다른 글
이벤트 처리2 (0) | 2016.03.31 |
---|---|
이벤트 처리 (0) | 2016.03.31 |
사용자 인터페이스 (UI) 기초 (0) | 2016.03.31 |
Error:Execution failed for task ':app:mergeDebugResources' (0) | 2016.03.29 |
Google Maps Android API v2 예제[펌] (0) | 2016.02.03 |