재사용 가능한 레이아웃을 만들고 사용하는 방법!
간단하지만 있는지를 모르면 아예 쓰지를 못하죠. 많이 해보는 것은 그래서 중요합니다.
어쨋든, 알아보도록 할게요.

Layout Tricks 레퍼런스 보기




우선 간단하게 순서를 말해볼게요.
1. 재사용할 layout xml (레이아웃 xml) 을 만든다. 위치 : res/layout
2. 액티비티와 매칭되는 레이아웃 xml에 include 태그를 추가한다.
   이때 속성은 android:layout_xxx... 면 충분하다.

3. 액티비티 코드에서 include 한 레이아웃을 받아와 하고 싶은 처리를 한다.





 1. 재사용할 Layout XML 만들기

기본적인 LinearLayout 을 사용한 레이아웃이니 다른 설명은 생략하겠습니다.

res/layout/layout_textview.xml


res/layout/layout_button.xml






 2. 액티비티의 XML에 include 로 재사용할 레이아웃 추가하기

기본 프로젝트에서 생성되는 xml로 처음에 액티비티를 만들면서 프로젝트를 생성한다면,
만들어진 기본 액티비티에 setContent 되어있는 레이아웃 xml 이다.


res/layout/main.xml


main.xml 이라는 레이아웃 xml의 코드를 잘 보면,
orientation이 vertical(자식뷰들을 세로로 배치하겠습니다.)로 되어있는 LinearLayout 안에 
include 가 2번 나오는 것을 볼 수 있습니다.

첫번째 include는 위의 1번에서 만든 layout_textview를 포함하는 녀석이고
두번째 include는 위의 1번에서 만든 layout_button을 포함하는 녀석입니다.

이렇게 하는 것 만으로 화면은 1번에서 만든 두 레이아웃을 포함하고 있게 됩니다.





 3. include한 레이아웃 받아서 처리하기

위의 처리들이 단순히 화면에 보이는 부분만을 위한 것이었다면,
여기서는 실제로 여러가지 세팅을 하고 이벤트를 처리하는 것을 할것입니다.

우선 첫번째로 텍스트뷰의 텍스트를 바꿀 것이고, (layout_textview 안의 두 텍스트뷰의 텍스트 바꾸기)
두번째로 버튼 클릭 이벤트를 처리할 것입니다.(layout_button 안의 두 버튼에 대한 클릭 이벤트를 처리)

우선 액티비티 전체 코드 입니다.

me.croute.example.layout/ExampleIncludeLayoutActivity.java




// layout_textview를 받아온다. layout_textview를 받아온 View textView 객체는 하위 자식들을 그대로 포함하고 있다.
// 이렇게 받아온 View textView는 layout_textview의 root뷰이다.
View textView = (View)findViewById(R.id.main_layout_textview);
         
// 받아온 textview를 통해 해당 View가 가진 하위 자식들을 받아온다.(reference한다.)
TextView tv01 = (TextView)textView.findViewById(R.id.layout_textview_01);
TextView tv02 = (TextView)textView.findViewById(R.id.layout_textview_02);

주석에 설명해 놓았듯이,
findViewById 로 받아오게 되면, textView 라는 View 인스턴스는 layout_textview 의 root 뷰를 가지게 되죠.

그렇기 때문에,!!
그 아래서 받아온 layout_textview의 root 뷰, 즉 textview 라는 View 인스턴스를 통해 하위 자식들까지 받아올 수 있는 것입니다.

컨테이너 개념만 알면 아주 쉽게 이해할 수 있는 부분이죠. 또는 뷰와 뷰그룹, 위젯들의 관계를 알고 있어도 쉽습니다.
(뷰와 뷰 그룹, 위젯에 대한 설명 : 
[Android] Activity, Window, android.widget, View, ViewGroup http://croute.me/425 )

그리고 그 세부적인 처리는 일반적으로 하듯이 처리하면 됩니다.
텍스트뷰에 대해서는 TextView.setText() 메소드를 통해,
버튼에 대해서는 Button.setOnClickListener() 메소드를 통해 리스너를 등록하고 onClick() 메소드에서 처리하는 것이죠.

이렇게 해두면 굳이 inflater를 통해 객체화 시켜서 여러가지에 대해서 처리 할 필요 없이,
레퍼런스에 레퍼런스를 하는 것만으로 많은 처리를 할 수 있게 됩니다.

이렇게 처리했을때의 가장 큰 장점은
하나의 레이아웃을 만들어두고 여러 레이아웃에서 손쉽게 재사용 할 수 있다는 것이겠죠?



예제 스크린샷




예제 프로젝트 파일 첨부



Posted by croute

댓글을 달아 주세요

  1. rain1986 2011.06.23 14:43 신고  댓글주소  수정/삭제  댓글쓰기

    찾던 자료였는데 알기쉽게 설명해주셔서 감사합니다.

  2. 1년차 2012.04.05 09:52 신고  댓글주소  수정/삭제  댓글쓰기

    매번 많이 배우고 갑니다 ㅋㅋ

  3. 신입 2013.04.08 20:58 신고  댓글주소  수정/삭제  댓글쓰기

    안드로이드 어플을 배우는 한 초보입니다.
    레이아웃을 공부중인데 앵그리버드라는 게임에서 새로운 Activity를 생성하는것같진 않고 width 가 한 2000되는 레이아웃을 사용하는것같은 옆으로 넘기는 화면사용.무슨 레이아웃을 사용하는지 여쭤볼수있을까요?
    너무 궁금합니다..

    • Favicon of http://croute.me BlogIcon croute 2013.04.09 17:07 신고  댓글주소  수정/삭제

      SurfaceView ?
      근데, 안드로이드로 게임을 만들고 싶으신 거면,
      Unity3D 나 Cocos2dx 같은 게임 엔진쪽을 공부하시는게 더 도움이 될거에요.
      게임들은 안드로이드 네이티브 뷰만 가지고 만들지 않습니다.

  4. BlogIcon 이름 2014.08.12 12:54 신고  댓글주소  수정/삭제  댓글쓰기

    자세한 설명을 찾고 있었는데 정말 감사합니다. 잘 공부 할께요~

  5. BlogIcon SI 3년차 2014.09.01 21:30 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다 ^^