본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] LayoutInflater와 Inflate 에 대해 알아보아요.

by 돼지왕왕돼지 2012. 1. 23.
반응형

/ 안드로이드 / Android / Tutorial / 기초 강좌 / Inflate / LayoutInflater / xml / XmlPullParser / getSystemService / LAYOUT_INFLATER_SERVICE / from / view /   성능 / compile time / build time / R. / resource / MenuInflater / getMenuInflater /   getLayoutInflater / 패턴 / 인플레이트 / 인플레이터 / 한 줄 / inflater /


1. Information


Inflate 란 생소한 단어인데, 뭐 하는 녀석인가요?


Inflate 는 사전적 의미로 "부풀리다" 라는 뜻입니다.

안드로이드에서 inflate 를 사용하면 xml 에 씌여져 있는 view 의 정의를 실제 view 객체로 만드는 역할을 합니다.
마치 건물의 설계도( xml 정의 )를 쭉~ 그려놓고 inflate ( 부풀리다 ) 하면 펑~ 하고 실제 건물 ( view ) 가 완성된다는 데서 inflate 라는 단어를 사용한 것 같습니다.



기본적인 사용 패턴을 알려주세요


 inflate 를 사용하기 위해서는 우선 inflater 를 얻어와야 합니다.

LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );



다음은 설계도 역할인 xml 이 필요합니다. 이 때 xml 의 root  view 의 type이 무엇인지 알아야 합니다.
예를 들어 xml 파일 이름이 inflate_example.xml 이고, root가 LinearLayout 이라면..

LinearLayout linearLayout = (LinearLayout) inflater.inflate( R.layout.inflate_example, null );



이제 가져온 view 를 화면에 그린다면..

setContentView( linearLayout );



취합해보면, 다음과 같은 패턴으로 주로 사용합니다.

LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE ); 
LinearLayout linearLayout = (LinearLayout) inflater.inflate( R.layout.inflate_example, null ); 
setContentView( linearLayout ); 




너무 간단해 보이는데, 요게 끝인가요?


먼저 인플레이터를 얻어오는 다른 방법이 있습니다.

LayoutInflater inflater = LayoutInflater.from( this );
LayoutInflater inflater = getLayoutInflater(); ( @activity )



인플레이터를 얻어오는 것과 inflate 를 하는 것을 한줄로 하려면..

LinearLayout linearLayout = (LinearLayout) VIew.inflate( this, R.layout.inflate_example, null );






뭐 추가적으로 알려줄 정보는 없나요?


 Inflater 는 성능상의 문제 때문에 compile time 에 완성된 xml 파일에 대해서만 적용 가능합니다.
즉, Runtime 에 작성되거나 제공되는 xml 에 대해서는 inflate 를 적용 할 수 없습니다.
다시 말해 R. 으로 시작되는 resource 파일들만 inflate 가능합니다.

overload 하고 있는 inflate API 함수들도 한번 같이 보죠.

View inflate( int resource, ViewGroup root )
View inflate( XmlPullParser parser, ViewGroup root )
View inflate( XMLPullParser parser, ViewGroup root, boolean attachToRoot )
View inflate( int resource, ViewGroup root, boolean attachToRoot )



마지막으로 지금까지 다룬 LayoutInflater 외에도 MenuInflater 도 있다는 것을 알려드리고 싶습니다
MenuInflater 는 getMenuInflater() 를 통해 얻어와서 ( @ activity ) void inflate( int menuRes, Menu menu )를 호출합니다.
이 메뉴 인플레이터도 성능상의 문제 때문에 compile time 에 생성된 xml, 즉 R. 으로 시작되는 resource 파일들에 대해서만 inflate 가 가능합니다.



2. Summary


- inflate 는 사전적 의미로 "부풀리다" 이며, 실제 Android 에서는 xml 파일에 정의되어 있는 view 에 대한 정의를 바탕으로 코드상에서 view 객체를 생성하는 것을 말합니다.

- inflate 는 inflater 얻어오기 -> inflate -> view 활용 의 패턴으로 주로 사용 됩니다.

- 가장 자주 쓰이는 inflater 는 LayoutInflater 이며 MenuInflater 도 있습니다.

- 성능상의 이유로 inflate 가능한 xml 은 compile time 에 resource 안에 있는 정의되어 있는 녀석들만 가능합니다.




3. References.


http://developer.android.com/reference/android/view/LayoutInflater.html 
  Android Developer Doc. LayoutInflater.

http://developer.android.com/reference/android/view/MenuInflater.html 
  Android Developer Doc. MenuInflater.



반응형

댓글22

  • 어릿광대 2014.05.28 17:22

    잘 정리되어 있네요~ 참고하겠습니다~
    답글

  • 퍼갈게요 2014.07.31 11:07

    정리가 잘되있어서 출처적고 담아갈게요~
    감사합니다
    답글

  • 2016.03.31 19:32

    잘 정리 되어있네요! 주소 퍼갈게요!
    답글

  • kalin 2016.07.22 19:38

    와 정말 깔끔한 설명입니다......
    답글

  • 우와 2016.12.23 18:52

    최고네요! 바로즐겨찾기했습니다
    답글

  • 당근 2017.04.02 16:39

    설명감사합니다 ㅎㅎ

    inflater의 기능이 결국 뷰들을 객체화 시키는 것으로 이해가 되는데,

    그러면 new 의 연산자와 차이가 무엇인가요 ??

    가령 layout의 경우는 new 를 사용 할 수 없기에 inflater를 사용하는 것인가요 ??
    답글

  • ss 2017.04.13 22:44

    감사합니다. 인플레이터에 대해 이해가 잘 안갔는데 어느정도 이해가 됐습니다.

    궁금한 부분이 있는데 액티비티 보통 사용하는 코드 중에
    setContentView(R.layout.activity_main); 같은 코드가 있는데요
    이것도 내부적으로는 인플레이트를 해서 쓰는 건가요?
    답글

  • ss 2017.04.18 22:42

    답변 감사드립니다.

    xml 을 뷰로 만든다는 부분에서 조금 더 해보고 싶은 게 있는데요
    xml 내부있는 뷰를 따로 빼서 쓰거나 복제할 수 있을까요?

    예를 들어

    abc.xml
    <LinearLayout ...>
    <TextView ...>
    </LinearLayout>

    이런 파일이 있을 때 <TextView> 만 따로 쓸 수 있는지 싶어서요.
    항상 abc.xml 자체를 통째로 인플레이트 해야 하나요?
    답글

    • 네 할 수 있습니다~
      재사용하고 싶은 부분만 따로 xml 로 정의를 하시구요
      <include> 라는 태그를 이용하면 그 녀석을 불러와 쓸 수 있습니다.

      또 다른 방법은 재사용하는 부분을 Custom View 로 만들어서 그 녀석을 불러 쓰는 방법도 있습니다.

      <com.aroundck.views.CustomView
      android:layout_width="wrap_content"
      ... />

      위와 같은 방법으로 말이죠~

  • ss 2017.04.20 21:36

    빠른 답변 감사드립니다.

    제가 설명이 부족했었네요 죄송합니다.

    사용하려는 위치는 자바 소스상이고요,
    예를 들어본다면

    View[] viewList = {
    layoutInflater.inflate( R.id.clone_view, null ),
    layoutInflater.inflate( R.id.clone_view, null ),
    ...
    }

    이렇게 id를 통해 뷰를 얻고 복제해서 써보고 싶습니다.
    (물론 이 코드는 정상 동작하지 않습니다.)

    스택오버플로우랑 여러 사이트를 찾아봤지만
    xml 을 통째로 인플레이트 하는 방법밖에 없다는 것 같아서요.

    혹시 id 를 통해 단독으로 해당 뷰를 복제해서 쓸 수 있는 방법이 없는지 찾고 있습니다.
    늦은 시간까지 답변 해주셔서 다시 한번 감사드립니다.
    답글

    • 네, 우선 xml 안에 들어 있는 뷰 하나만을 inflate 하는 방법은 없는 것으로 보입니다.

      만약 동일한 뷰를 xml 에도 사용하고, 자바 코드상에서도 사용하려면, 위에 말씀드린데로 재사용하고 싶은 뷰를 xml 로 따로 정의를 하시고요,

      xml 에서는 include 로 가져다 쓰고, java 코드상에서는 해당 view 만 inflate 하는 방법으로 쓰셔야 할 것으로 보입니다~~

  • xcvcx 2017.10.10 18:04

    json으로 받아온 데이터를 layoutinflater로 레이아웃에 뿌려주고있습니다. 데이터 양이 점점 많아지면서 더보기(footer?)기능을 고 싶은데 검색을 하다보니 커스텀리스트뷰?를 이용하더라구요 그럼 소스를 전체적으로 수정해야하는데 다른방법은 없을까요?
    답글

    • 우선 json 으로 받아온 데이터를 inflate 한다는 것이 재미있네요. 그런데 뷰 구성을 어떻게 하는지 몰라 정확한 답변은 어렵네요.

      좀 더 구체적으로 알려주시면, 방법이 있다면 조언을 해 드릴 수 있을 것 같습니다.

      그리고 참고로 Footer 를 붙이는 것은 꼭 커스텀 리스트뷰가 아닌 일반 리스트뷰로도 가능합니다.

  • 겸박 2017.10.23 20:31

    "건물의 설계도( xml 정의 )를 쭉~ 그려놓고 inflate ( 부풀리다 ) 하면 펑~ 하고 실제 건물 ( view ) 가 완성된다는 데서 inflate 라는 단어를 사용한 것 같습니다." 왜 inflate라는 단어를 썼을까 와닿지 않았는데 설명을 보니 그런것 같아요ㅎㅎ
    답글

  • shiningjean 2017.11.25 00:31

    정리가 쉽게 잘 되 있어서 주고 적고 퍼갑니다 !!감사합니다~
    답글

  • 2020.02.15 17:05

    혹시
    LinearLayout linearLAyout = (LinearLayout) VIew.inflate( this, R.layout.inflate_example, null );
    여기서 , 첫번째와 두번째 인자 순서를 바꿔서

    LinearLayout linearLAyout = (LinearLayout) VIew.inflate( R.layout.inflate_example,this, null );
    이렇게 수정되어야하지 않나요?



    답글

    • inflate 함수의 method signature 는 "public static View inflate (Context context, int resource, ViewGroup root)" 입니다.
      다른 inflate 함수와는 조금 다른 순서를 가지고 있네요.
      따라서 본문에 표시된 내용이 맞습니다~