ビューの読み込みを遅らせる

レイアウトによっては、ほとんど使用されない複雑なビューが必要になる場合があります。アイテムの詳細、進行状況インジケーター、または「元に戻す」メッセージのいずれであっても、必要なときにのみビューを読み込むことにより、メモリ使用量を削減し、レンダリングを高速化できます。

複雑なビューがアプリで将来必要とされる可能性がある場合は、リソースの読み込みを先送りする手法を使用することをおすすめします。この手法を実装するには、複雑でほとんど使用されないビューに対して 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()

Java

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 属性で指定されたものです(ViewStub で指定された ID android:id は、ViewStub レイアウトが可視化またはインフレートされるまでの間のみ有効です)。

注: ViewStub の難点の一つは、現在、インフレート対象のレイアウトで <merge> タグに対応していないことです。

このトピックの詳細については、Optimize with stubs(ブログ投稿)をご覧ください。