안드로이드에서의 UI 컴포넌트의 공유와 재사용은 <incude /> 태그 덕분에 매우 쉽다. 거의 사용되지 않는 많은 수의 view를 가져야하는 복잡한 UI를 생성하기 쉽다. 고맙게도 안드로이드는 매우 특별한 위젯인 ViewStub를 제공해 개발자가 거의 사용하지 않는 view로 사용자 인터페이스를 지저분하게 만들지 않고 <include />의 모든 이점을 사용할 수 있도록 해준다.
ViewStub는 더미이며 가벼운 view다. 차원을 가지고있지 않고 어떤 방식으로든 레이아웃에 참여하지 않는 그 어떤 것도 그리지 않는다. 이는 ViewStub가 view계층내에서 유지하기에 매우 저비용이며 inflate 하기에도 매우 저비용이라는 뜻이다. ViewStub는 lazy include 이라 할수 있다. ViewStub에 의해 참조되는 레이아웃은 개발자가 그렇게 하고자 할때에만 사용자 인터페이스에 추가되고 inflate 된다.
아래의 화면은 Shelves 어플리케이션이다. 스크린샷에 보여지는 activity의 주목적은 브라우징 가능한 책의 목록을 표현하기 위한 것이다.
이 activity는 새로운 책을 추가하거나 import 할때 사용될수 있다. 작업을 수행하는 동안, Shelves는 사용자 인터페이스의 극히 일부만 보여준다. 아래의 스크린샷은 import 하는 동안 화면의 밑 부분에 나타나는 진행 바와 취소 버튼을 보여준다.
최소한 책 목록을 브라우징하기 위한 것과 비교해 본다면 책을 import하는것은 공통된 연산이 아니므로 import 패널은 원래 ViewStub에 의해 표현된다.
사용자가 import 과정을 초기화 할때 ViewStub는 참조하고 있는 레아아웃 파일의 내용에 의해 inflate되고 대체된다.
ViewStub를 사용하기 위해 필요한 것은 나중에 stub를 inflate 시키기 위한 android:id 속성, 어떤 레이아웃 파일을 포함하고 inflate 할지를 참조하기 위한 android:layout 속성이 전부다. stub은 당신이 세번째 속성인 android:inflateid(포함된 파일의 루트id를 재정의하는데 사용될수 있다)를 사용할수 있도록 해준다. 마지막으로 레이아웃 파라미터를 stub에 명시해 포함되는 레이아웃의 루트에 적용될수 있도록 해준다. 아래의 예를 보자.
stube를 inflate할 준비가 됐을때 단지 inflate() 메서드를 호출하기만 하면 된다. 또는 stub의 가시성을 VISIBLE, INVISIBLE 로 변경하고 stub를 inflate할 수 있다. 하지만 inflate() 메서드는 inflate 레이아웃의 루트 view를 리턴하는 이점을 가지고 있다는 것을 주목하라.
stub가 inflate 된후 view 계층 구조에서 제거될다는것이 매우 중요하다. 이처럼 ViewStub에서 오래 동안 참조를 유지해야하는것을 불필요하다. (예를 들어, 클래스 인스턴스 필드처럼)
ViewStub는 쉬운 프로그래밍과 효율성 사이의 위대한 타협이다. 수동으로 view를 inflate 하고 view 계층 구조에 런타임시 추가하는 대신 단순히 ViewStub를 사용하라. 현재 ViewStub의 유일한 단점은 <merge />태그를 지원하지 않는다는 것뿐이다.