긍정곰의 연구소

안드로이드 - XML 안드로이드 레이아웃 종류 본문

긍정곰의개발일지/Android

안드로이드 - XML 안드로이드 레이아웃 종류

긍정곰 2017. 10. 5. 21:38
안드로이드는 기본적으로 자바(JAVA)의 스윙(Swing)을 많이 닮아있다.

실질적으로 기본 프로젝트를 생성했을때 MainActivity.java내부를 보면 Activity 클래스를 상속하여 레이아웃을 구성한다는것을 알수있다.(자바의 스윙도 기본적으로 프레임 클래스를 상속하여 기본 윈도우를 구성한다)

내가 참고하고 있는 서적에서도 레이아웃을 코드(자바)로 구성할수 있다고 언급하고있는데 이 방식은 추천되는 방법은 아니므로 일반적으로 XHTML(확장자가 xml인 그문서다)로 기술되는 방법을 추천하고있는데 처음에 익히기에는 굉장히 난해하고 난잡해보일지 모르나 어느정도 익숙해지면 이전의 불편한 개발방식의 구성(이를 테면 WinAPI...)을 가진 환경에서 어떻게 그동안 잘도 개발해왔나 싶은 생각이 들정도로 편하다.

즉, 익숙해지면 이만큼 편한게 없다는 소리다.

기존에 내가 그나마 잘 활용할수있는 WinAPI와 비교를 해보자면(애시당초 비교하는게 우습기도 하지만...)WinAPI는 디자인 레이아웃과 로직을 따로 분리하기가 힘들다.

애시당초 C언어로 모든게 작성되어져야하고 기껏해서 함수로 기능을 분리하는게 고작이라 레이아웃 구성과 로직을 따로놓고 보기가 어렵다.

허나 안드로이드의 구성방식은 레이아웃과 로직을 따로 때어놓고 보기가 용이하다.

애시당초 로직은 자바코드로 이루어지고(버튼을 눌렀을때 이미지를 보여주거나 숨기거나 하는 이벤트 처리)레이아웃은 XHTML로 구성되기때문에 따로 때어놓고 볼수가 있다. (여기서도 스윙과 비슷한... 아니 거의 동일한 부분이 존재하는데 안드로이드도 이벤트 리스너를 통하여 사용자의 입력을 받고 처리하는 구성이기때문에 스윙을 배워두었다면 익히기가 용이하다)

물론 그렇다해서 둘이 아예 독립적인 구성은 아닌데... 이를테자면 이벤트처리가 필요한 파생된 뷰(버튼, 에디트, 이미지 등)에는 ID가 부여되어야하는데 이 ID는 코드에도 영향을 주기때문이다.(어찌보면 당연하다)

조금 잡설이 길었는데 요점을 정리해보자면... 레이아웃을 따로 때어놓고 보기용이하기에 카테고리를 따로 나눈것이고 이 카테고리에는 XHTML 스크립트위주로 포스트를 써나갈것이다.

본론으로 들어가 안드로이드 레이아웃 종류는 아래와 같다.

리니어 레이아웃(선형) : 이름대로 선형으로 orientation 속성에 따라 가로, 세로 방향으로 뷰를 나열한다.
<LinearLayout></LinearLayout>
릴레티브 레이아웃(관계형) : 중심점이 되는 하나의 뷰를 기준으로 주변에 뷰를 배치한다.
<RelativeLayout></RelativeLayout>
프레임 레이아웃(틀형) : 이쪽은 틀이라기보다는 사용용도때문에 플로팅이라는 이름이 더 어울릴법한 레이아웃이다. 주로 부모뷰로서 하위의 자식뷰들을 실행중에 보이거나 숨길수있는 방식으로 사용되며 내부 배치되는 뷰들은 겹쳐서 표시된다.
<FrameLayout></FrameLayout>
테이블 레이아웃(표형) : 스프레드시트 스타일(마이크로소프트 오피스의 엑셀 같은...)로 표를 구성하여 배치하는 방식이다. 리니어 레이아웃으로 이 레이아웃을 흉내내는게 가능하나 노가다(중첩질)가 필요하기때문에 여러뷰를 반듯하게 배치하고싶다면 이 레이아웃을 쓰는게 훨씬 낫다.
<TableLayout></TableLayout>
앱솔루트 레이아웃(절대형) : 쉽게 WinAPI로 레이아웃을 구성하는걸 생각하면되는데 x, y 좌표값 몇에 몇 위치에 이 뷰를 배치하라... 는 식의 구성이다. 다시 말해 위의 레이아웃들(프레임 레이아웃을 제외한)처럼 레이아웃에서 뷰들의 배치를 통제하지 않는 형태이므로 직접 해당좌표에 배치시켜야 한다.
물론 그렇다고 아예 쓸머가 없는것은 아니고 자기가 무조건 원하는 위치에 해당 뷰를 배치시키고 싶을시에는 사용성이 있긴하다.
<AbsoluteLayout></AbsoluteLayout>
그리드 레이아웃(격자형) : 4.0 아이스크림 샌드위치 부터 추가된 레이아웃이라고 한다.
자세한건 추후에 추가...
<GridLayout></GridLayout>


Comments