뷰 로드 지연

때때로 레이아웃에 사용 빈도가 매우 낮은 복잡한 뷰가 필요한 때가 있습니다. 종류(예: 항목 세부정보, 진행률 표시기 또는 실행취소 메시지)에 상관없이 필요할 때만 뷰를 로드하여 메모리 사용을 줄이고 렌더링 속도를 높일 수 있습니다.

리소스 로드를 지연하는 것은 나중에 앱에 필요할 수도 있는 복잡한 뷰가 있을 때 사용할 중요한 기법입니다. 복잡하고 거의 사용되지 않는 뷰의 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:idViewStub 레이아웃이 표시 및 확장될 때까지만 유효합니다.

참고: 현재 ViewStub의 한 가지 단점은 확장할 레이아웃에서 <merge> 태그를 지원하지 않는다는 것입니다.

이 주제에 관한 자세한 내용은 스텁으로 최적화(블로그 게시물)를 참고하세요.