때때로 레이아웃에 사용 빈도가 매우 낮은 복잡한 뷰가 필요한 때가 있습니다. 종류(예: 항목 세부정보, 진행률 표시기 또는 실행취소 메시지)에 상관없이 필요할 때만 뷰를 로드하여 메모리 사용을 줄이고 렌더링 속도를 높일 수 있습니다.
리소스 로드를 지연하는 것은 나중에 앱에 필요할 수도 있는 복잡한 뷰가 있을 때 사용할 중요한 기법입니다. 복잡하고 거의 사용되지 않는 뷰의 ViewStub
을 정의하여 이 기법을 구현할 수 있습니다.
ViewStub 정의
ViewStub
은 차원이 없는 가벼운 뷰로, 무엇을 그리거나 레이아웃에 참여하지 않습니다. 따라서 확장하든 뷰 계층 구조에 그대로 남겨두든 리소스 사용이 적습니다.
각 ViewStub
은 간단히 android:layout
속성을 포함하여 확장할 레이아웃을 지정해야 합니다.
다음 ViewStub
은 반투명 진행률 표시줄 오버레이용입니다. 새 항목을 앱에 가져올 때만 표시됩니다.
<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 레이아웃 로드
ViewStub
에서 지정된 레이아웃을 로드하려면 setVisibility(View.VISIBLE)
를 호출하여 표시되도록 설정하거나 inflate()
를 호출합니다.
Kotlin
findViewById<View>(R.id.stub_import).visibility = View.VISIBLE // or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
자바
findViewById(R.id.stub_import).setVisibility(View.VISIBLE); // or View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
참고: inflate()
메서드는 완료되면 확장된 View
를 반환하므로 레이아웃과 상호작용해야 하는 경우 findViewById()
를 호출하지 않아도 됩니다.
표시 및 확장되고 나면 ViewStub
요소는 더 이상 뷰 계층 구조의 일부가 아닙니다. 확장된 레이아웃으로 교체되며 이 레이아웃의 루트 뷰 ID는 ViewStub의 android:inflatedId
속성으로 지정된 ID입니다. ViewStub
에 지정된 ID android:id
는 ViewStub
레이아웃이 표시 및 확장될 때까지만 유효합니다.
참고: 현재 ViewStub
의 한 가지 단점은 확장할 레이아웃에서 <merge>
태그를 지원하지 않는다는 것입니다.
이 주제에 관한 자세한 내용은 스텁으로 최적화(블로그 게시물)를 참고하세요.