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.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] read-only file system. 루팅 후에도 나오네요. 어떻게 해야 할까요? (7) | 2012.01.24 |
---|---|
[Android/안드로이드] Manifest Activity Tag 의 windowSoftInputMode 속성에 대해 파헤쳐보아요! (0) | 2012.01.23 |
[Android/안드로이드] LayoutInflater와 Inflate 에 대해 알아보아요. (22) | 2012.01.23 |
[Android/안드로이드] Manifest Activity 의 속성 exported에 대해 알아보아요. (0) | 2012.01.23 |
[Android/안드로이드] Manifest Activity 의 속성 ConfigChanges 에 대해 알아보아요. (0) | 2012.01.23 |
[Android/안드로이드] Android Developer AsyncTask 파트 번역본입니다. (4) | 2012.01.20 |
잘 정리되어 있네요~ 참고하겠습니다~
답글
정리가 잘되있어서 출처적고 담아갈게요~
감사합니다
답글
잘 정리 되어있네요! 주소 퍼갈게요!
답글
출처만 잘 밝혀주세요~
와 정말 깔끔한 설명입니다......
답글
감사합니다 ^ ^
최고네요! 바로즐겨찾기했습니다
답글
설명감사합니다 ㅎㅎ
inflater의 기능이 결국 뷰들을 객체화 시키는 것으로 이해가 되는데,
그러면 new 의 연산자와 차이가 무엇인가요 ??
가령 layout의 경우는 new 를 사용 할 수 없기에 inflater를 사용하는 것인가요 ??
답글
new 와의 차이를 묻는 질문이 이해가 잘 안 되서 어떻게 답변드려야 할지 모르겠습니다 ㅠ
감사합니다. 인플레이터에 대해 이해가 잘 안갔는데 어느정도 이해가 됐습니다.
궁금한 부분이 있는데 액티비티 보통 사용하는 코드 중에
setContentView(R.layout.activity_main); 같은 코드가 있는데요
이것도 내부적으로는 인플레이트를 해서 쓰는 건가요?
답글
네, 소스를 쭉~ 따라가보진 않았지만 내부적으로 inflater 를 사용할 것으로 보입니다~
답변 감사드립니다.
xml 을 뷰로 만든다는 부분에서 조금 더 해보고 싶은 게 있는데요
xml 내부있는 뷰를 따로 빼서 쓰거나 복제할 수 있을까요?
예를 들어
abc.xml
<LinearLayout ...>
<TextView ...>
</LinearLayout>
이런 파일이 있을 때 <TextView> 만 따로 쓸 수 있는지 싶어서요.
항상 abc.xml 자체를 통째로 인플레이트 해야 하나요?
답글
네 할 수 있습니다~
재사용하고 싶은 부분만 따로 xml 로 정의를 하시구요
<include> 라는 태그를 이용하면 그 녀석을 불러와 쓸 수 있습니다.
또 다른 방법은 재사용하는 부분을 Custom View 로 만들어서 그 녀석을 불러 쓰는 방법도 있습니다.
<com.aroundck.views.CustomView
android:layout_width="wrap_content"
... />
위와 같은 방법으로 말이죠~
빠른 답변 감사드립니다.
제가 설명이 부족했었네요 죄송합니다.
사용하려는 위치는 자바 소스상이고요,
예를 들어본다면
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 하는 방법으로 쓰셔야 할 것으로 보입니다~~
json으로 받아온 데이터를 layoutinflater로 레이아웃에 뿌려주고있습니다. 데이터 양이 점점 많아지면서 더보기(footer?)기능을 고 싶은데 검색을 하다보니 커스텀리스트뷰?를 이용하더라구요 그럼 소스를 전체적으로 수정해야하는데 다른방법은 없을까요?
답글
우선 json 으로 받아온 데이터를 inflate 한다는 것이 재미있네요. 그런데 뷰 구성을 어떻게 하는지 몰라 정확한 답변은 어렵네요.
좀 더 구체적으로 알려주시면, 방법이 있다면 조언을 해 드릴 수 있을 것 같습니다.
그리고 참고로 Footer 를 붙이는 것은 꼭 커스텀 리스트뷰가 아닌 일반 리스트뷰로도 가능합니다.
"건물의 설계도( xml 정의 )를 쭉~ 그려놓고 inflate ( 부풀리다 ) 하면 펑~ 하고 실제 건물 ( view ) 가 완성된다는 데서 inflate 라는 단어를 사용한 것 같습니다." 왜 inflate라는 단어를 썼을까 와닿지 않았는데 설명을 보니 그런것 같아요ㅎㅎ
답글
정리가 쉽게 잘 되 있어서 주고 적고 퍼갑니다 !!감사합니다~
답글
좋게 봐주셔서 감사합니다.
출처 표시만 잘 해주세요 ㅎ
혹시
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 함수와는 조금 다른 순서를 가지고 있네요.
따라서 본문에 표시된 내용이 맞습니다~