Android.widget.LinearLayout
레이아웃(Layout)의 크기
레이아웃이 화면에서 얼마만큼의 크기를 차지하게 할것인가를 정할 수 있습니다. 가로크기와 세로크기에 대해서 숫자, 비율, 레이아웃이 가지는 자식들의 크기값으로 지정할 수 있습니다.
- | 부모크기만큼 | 가질 데이터 크기만큼 | pixel 또는 dp(dip) |
| fill_parent | wrap_content | 480px 또는 320dp |
| fill_parent | wrap_content | 800px 또는 533dp |
-
android:layout_width
- 이 속성은 레이아웃의 가로크기를 나타냅니다.
-
android:layout_height
- 이 속성은 레이아웃의 세로크기를 나타냅니다.
- 부모크기만큼 (부모의 전체크기중에서, 내가 지금 작성한 레이아웃보다 먼저 작성된 레이아웃을 제외하고 남은 크기)
- 현재 안드로이드 SDK 버전이 올라가면서 SDK 2.2부터는 match_parent 라는 값이 나오고 있습니다. 이 값은 기존의 fill_parent와 같은 값이지만, 아직은 모든 디바이스가 2.2 이상의 SDK를 사용하지 않으니, 이 값은 사용하지 않습니다. 기존 처럼 부모크기처럼 지정할때에는 fill_parent라고 설정해줍니다.
- 가지게 될 데이터 크기만큼
- 내가 작성하려는 레이아웃이 가지게될 자식 레이아웃들의 크기가 얼마나 커질지 알 수 없는 상황일때 사용합니다. 또는, 텍스트 뷰, 이미지 뷰의 경우에는 입력받게될 텍스트, 입력될 이미지의 크기에 따라 레이아웃의 크기를 변경할때 사용합니다.
- pixel 또는 dp(dip)로 직접지정
- Android 디자이너와의 협업을 위한 몇가지 팁
- 대체리소스 제공하기 (Android Providing Resource)
- 직접 숫자를 지정해서 레이아웃을 작성할수도 있습니다. 하지만 이방법은 반은 추천하고 반은 추천하지 않습니다. dp의 경우에는 잘만사용한다면 왠만한 경우에 대해서도 같은 UI를 제공할 수 있는 방법이기 때문에 추천되는 경우이지만, pixel의 경우에는 상당히 비추천하는 방법입니다. 관련글 링크를 읽어보시면 아시겠지만, dp를 사용하는 방법은 많은 Resource를 제공해 줄 수 없는 상황에서 상당히 현명하고 유리한 선택이 될 수 있습니다. 모든 리소스를 제공할 수 있다면 모든 디바이스에 같은 UI를 보여줄 수 있겠지만 이는 사실상 힘든일이기 때문입니다.
Weight 적용 방법
weight 값에 따라 View의 크기를 변화시키고자 할 경우 layout_width
또는 layout_height
값이 0dp
이여야 한다.
gravity & layout_gravity
우선 gravity라는 단어가 모두 들어가는 두 속성이기 때문에 중력작용을 하는것인가 보다 라고 알 수 있습니다. 이제 이 속성에 들어가는 값에 따라서 레이아웃들은 그 위치로 중력을 받게 됩니다. 우리가 땅(아래)쪽으로 중력을 받는것처럼 말이죠.
-
android:gravity
- 이 속성은 현재 작성하고 있는 레이아웃의 자식 레이아웃들이 중력을 어디로 가질지 정해줍니다.
-
android:layout_gravitiy
- 이 속성은 현재 작성하고 있는 레이아웃의 중력을 어디로 가질지 정해줍니다.
부모레이아웃에서 gravity 속성에 있는 값은 자식레이아웃에서 layout_gravity에 있는 값과 같은 결과를 낼 수 있습니다. 그럼에도 두 속성을 모두 쓰려는 이유는 자식 레이아웃들이 일괄적으로 중력을 가져야 하는 경우에는 부모레이아웃에서 설정한 gravity 속성만으로 해결할 수 있지만, 자식 레이아웃들이 각각 다른 중력을 가져야 할 경우엔, 자식 레이아웃들에서 left, right 등을 설정해 주어야 하기 때문입니다. 총 7가지의 값들이 있고 그 값들은 아래와 같습니다.
android:gravity
와 android:layout_gravity
에 설정할 수 있는 값들:
-
left
(왼쪽으로 중력주기) -
right
(오른쪽으로 중력주기) -
top
(위로 중력주기) -
bottom
(아래로 중력주기) -
center_vertical
(수직 가운데로 중력주기) -
center_horizontal
(수평 가운데로 중력주기) -
center
(정가운데로 중력주기)
또한 이 7가지의 값들은 논리적으로 만족하는 경우에는 복수의 값을 지정할 수 있습니다. (예를들면 왼쪽으로 중력을 주면서, 수직 가운데로 중력을 준다거나, 수평가운데로 중력을 주면서 아래로 중력을 준다거나 하는 경우, 오른쪽으로 중력을 주면서 동시에 아래로 중력을 주는 경우등.)
아래는 여러가지 경우에 대해
-
gravity
(부모에서 자식에세 gravity 속성을 지정하는 경우)와 -
layout_gravity
(자기 자신의 gravity 속성을 지정하는 경우)에 대해 그림으로 표현한 것입니다.
Android_layout_gravity.png
orientation
LinearLayout에서 orientation
속성은 매우 중요합니다. 이 속성을 통해 기본적으로 자식(child) 뷰 들을 어떻게 배치할지 결정할 수 있습니다. 속성 값에는 두가지가 있습니다.
-
horizontal
- 자식 뷰(위젯)들을 가로(수평)으로 배치하겠다.
-
vertical
- 자식 뷰(위젯)들을 세로(수직)으로 배치하겠다.
방대한 내용이 아니기 때문에 짧게 썼지만, 굉장히 중요합니다. LinearLayout은 orientation
을 설정하지 않더라도 기본적으로 horizontal
의 속성값을 default로 가지고 있습니다.
layout_weight
안드로이드에서 레이아웃을 구성할때 layout_weight
(가중치) 속성은 많은 일을 할 수 있게 해줍니다. 레이아웃을 자동으로 늘리고 줄이고 채우는 일들을 해주기 때문에, layout_weight
속성을 사용하면 해상도가 다양한 여러 기기들에 깨지지 않는 UI를 제공해 줄 수 있습니다. 숫자로 지정해 버리면 테스트했던 디바이스가 아닌, 해상도가 다른 디바이스에서 보았을 때, 개발자가 원하지 않는 UI가 나올수 있는데, layout_weight
속성은 이런점을 해결해줄 수 있습니다.
background
뒷 배경이미지를 사용할 경우 이 속성을 통해 설정할 수 있습니다. 간단하게 android:background
라는 속성만으로 여러가지 것들을 설정 할 수 있습니다.
- 색상 설정:
android:background="#FFFFFF"
- 배경 이미지 설정:
android:background="@drawable/이미지파일이름"
(res/drawable
에 가지고 있는 이미지 리소스를 통해 배경 설정) - 버튼클릭 제스쳐, 상태에 따른 버튼이미지 변경, xml 파일로 만들기
See also
Favorite site
References
-
Hedge's_Thought_-_Android_understanding_LinearLayout.pdf ↩