본문 바로가기

코딩 학습/안드로이드

[안드로이드] android:gravity와 android:layout_gravity의 차이

안드로이드 xml에서 LinearLayout(선형 배치 혹은 순차적 배치) 속성을 이용하다보면

각 위젯들의 배치를 위해

android:gravity와 

android:layout_gravity 항목이 자주 쓰인다.

 

필자의 경우, 쓰다보니 어느 순간부터는 둘 중에 먹히는 걸로 쓰고 있긴 한데;(보통은 중앙 정렬만 써서)

이렇게 해서는 배움이 없겠다 싶기도 하고 나중에 코드가 방대해지면 어디선가 문제가 생길것 같아 이 기회에 정리를 하고자 한다.

 

먼저 두 함수의 사전적 정의는

1. android:gravity = 자신에게 포함된 위젯(자식 요소)을 어디에 배치 시킬지 결정

2. android:layout_gravity = 자신의 위치를 부모 요소의 어디에 배치할지 결정

 

음 근데, 이런 사전적 정의도 중요하지만 이해가 잘 안되는 나같은 초짜는 봐야 이해가 된다.

먼저, Linear Layout에 실험체 버튼을 한놈 집어 넣자.

 

오늘 실험해 볼 케이스는 아래와 같다.

1) LinearLayout 에 gravity 함수 적용

2) LinearLayout 에 layout_gravity 함수 적용

3) Button에 gravity 함수 적용

4) Button에 layout_gravity 함수 적용

그리고 각 실험마다 우리가 원하는 아니, 내가 원하는 중앙정렬을 여러모로 적용해본다.(center, center_vertical, center_horizontal)

 

먼저 1)번 실험 (LinearLayout에 gravity 속성을 추가한 경우)

위에서 얘기한대로 '레이아웃'의 '자손 요소'인 버튼이 정렬되는 것을 볼수 있다.

 

2)번 실험 (LinearLayout에 layout_gravity 속성을 추가한 경우)

꿈쩍도 안한다.

당연하다. 현재 xml에서 LinearLayout의 부모 요소는 없으니까.

 

3)번 실험 (Button에 gravity 속성을 추가한 경우)

좀 더 극적으로 나타내기 위해 버튼의 가로 세로 높이를 250dp로 고정했다.

(세로가 wrap_content면 콘텐츠의 높이와 동일해서 center_vertical이 잘 안나타남)

Layout에 적용했을때와 결과는 다르지만 원리는 같다.

현재 gravity 함수는 버튼에 적용되어 있으니까, 버튼의 '하위요소'인 텍스트값의 위치가 변경되는 것을 볼수 있다.

 

4)번 실험 (Button에 layout_gravity 속성을 추가한 경우)

음.. 움직이기는 하는데, 

수직 성분으로는 정리가 안된다?

이는 LinearLayout의 특성이 Button 보다 상위에 존재하기 때문에 수직으로는 변경이 안되는 것으로 보인다.

즉, 현재 레이아웃은 위에서 부터 차례대로 쌓는 방식(android:orientation="vertical")이다 보니 버튼의 속성을 바꾸어서는 수직 위치 속성은 바꾸지 못하는 것으로 보인다. (어디, 버튼따위가 수직으로 움직일려고 하냐)

(orientation속성이 horizontal이면 버튼의layout_gravity는 center_vertical과 center만 먹힌다.)

 

∴ LinearLayout에 버튼 한개 있는 구조에서 gravity/layout_gravity 함수를 적용한 실험 결과를 간략히 정리하자면

1) LinearLayout 에 gravity 함수 적용             ▶ 버튼이 수직/수평 정렬됨

2) LinearLayout 에 layout_gravity 함수 적용 ▶ 안됨

3) Button에 gravity 함수 적용                        ▶ 버튼의 글자가 수직/수평 정렬됨

4) Button에 layout_gravity 함수 적용            ▶ 버튼이 수평 정렬됨 (현재 LinearLayout 속성에서 정의되지 않은 방향만 정렬됨)