ビューの読み込みの先延ばし

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

複雑なビューがアプリで将来必要とされる可能性がある場合は、リソースの読み込みを先送りする手法をおすすめします。この手法を実装するには、複雑でほとんど使用されないビューに対して 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 の難点の 1 つは、現在、インフレート対象のレイアウトで <merge> タグに対応していないことです。

このトピックの詳細については、スタブを使用した最適化(ブログ投稿)をご覧ください。