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

[Android/안드로이드] Android Layout Tricks #4 : Optimize with stubs

by 돼지왕 왕돼지 2012. 4. 17.
반응형




안녕하세요 돼지왕왕돼지입니다.

오늘은 "Android Layout Tricks #4 : Optimize with stubs" 주제로 이야기하고자 합니다.

이 글은   http://android-developers.blogspot.com/2009/03/android-layout-tricks-3-optimize-with.html 내용을 의역한 것입니다.

Android Layout Tricks #4 : Optimize with stubs

안드로이드 앱을 개발하다 보면, Activity 에 많은 view 들을 배치할 경우가 생기고, 이 때 거의 사용하지 않는 layout part 를 포함하는 경우가 있습니다. 고맙게도 안드로이드는 이런 거의 사용하지 않는 layout 을 ViewStub 이라는 것으로 묶어두어 view tree 를 깔끔하게 유지시키고, 필요할 때 inflate 해서 사용할 수 있도록 도와주고 있습니다. 이 ViewStub 은 <include /> 와 콤보를 이루죠.


VIewStub 은 매우 가볍고, 존재감도 거의 없는 view 입니다. dimension 을 가지고 있지도 않고, 아무것도 그리지 않습니다. 그러면서도 inflate 하기에 매우 쉽고 view hierarchy 에 부담을 주지 않은 상태로 유지합니다. VIewStub 은 lazy include 라고 하는 것이 가장 잘 된 묘사라고 볼 수 있겠습니다. ViewStub 은 코드상으로 그렇게 하고자 할때 딱 inflate 됩니다.


다음 screenshot 은 Shelves 어플을 보여줍니다. 



같은 activity 에서 간혹 user 가 새로운 책을 더하거나 import 하는 경우가 생깁니다. 이 때 하단에 progress bar 와 cancel button 이 있는 layout 을 추가로 보여줍니다.



book import 하는 것은 일반적인 작업이 아닙니다. 책을 browse 하는 것과 비교하여 매우 minor 한 빈도로 발생하는 작업이라는 이야기지요. 이 import panel 은 원래 ViewStub 으로 지정되어 있습니다.



user 가 import process 를 시작하였을 때 ViewStub 은 inflate 되어 view tree 상 기존의 ViewStub element 를 layout 으로 교체합니다.



ViewStub 을 사용하기 위해 설정해 줘야 하는 설정항목들은 android:id 입니다. inflate 할 때 사용됩니다. android:layout 도 필요합니다. inflate 해서 include 해줄 layout 을 연결해줘야 하니깐요. android:inflatedId 도 필요한데, 이 녀석은 include 되는 layout 의 id 를 override 하는 녀석입니다. 마지막으로 추가적으로 적용하는 속성들은 roof layout 의 속성에 적용됩니다. 예제를 보시죠.


<ViewStub

  android:id="@+id/stub_import"

  android:inflatedId="@+id/panel_import"


  android:layout="@layout/progress_overlay"


  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:layout_gravity="bottom" />


ViewStub 을 inflate 하기 위해서는 inflate() 함수를 호출하거나, visibility 를 VISIBLE 또는 INVISILBE 로 바꿔주면 됩니다. 이 두가지 방법 중 inflate() 는 root view 를 return 한다는 장점이 있습니다. 예제를 보시죠.


((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);

// or

View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();


stub 을 inflate 하게 되면 view hierarchy 에서 stub 이 제거되고 그 자리를 inflate 된 layout 이 채운다는 사실을 꼭 기억해야 합니다.


ViewStub 은 Runtime 에 어떤 layout 을 inflate 해서 수동으로 붙여주는 것보다 훨씬 쉽게 사용할 수 있는 효율적인 방법입니다. ViewStub 의 단점은 <merge /> tag 와 함께 사용이 안 된다는 점입니다.


도움이 되셨다면 손가락 꾸욱~




 
반응형

댓글