レイアウトによっては、ほとんど使用されない複雑なビューが必要になる場合があります。アイテムの詳細、進行状況インジケーター、または「元に戻す」メッセージのいずれであっても、必要なときにのみビューを読み込むことにより、メモリ使用量を削減し、レンダリングを高速化できます。
複雑なビューがアプリで将来必要とされる可能性がある場合は、リソースの読み込みを先送りする手法を使用することをおすすめします。この手法を実装するには、複雑でほとんど使用されないビューに対して 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(ブログ投稿)をご覧ください。