オンデマンドでビューを読み込む

場合によっては、ほとんど使用されない複雑なビューがレイアウトに必要なことがあります。かどうか アイテムの詳細、進行状況インジケーター、メッセージの取り消しです。 レンダリングの高速化が可能になります。 必要ありません。

アプリに複雑なビューがある場合、リソースの読み込みを遅らせることができる 将来的なニーズに対応するために ViewStub: ほとんど使用されないビューです

ViewStub を定義する

ViewStub は、 描画したり、レイアウトに関与したりできます。そのため、必要なリソースが最小限で済みます。 ビュー階層内にインフレートして残します各 ViewStub に含まれるもの android:layout 属性でインフレートするレイアウトを指定します。

ユーザー ジャーニーの後半で読み込む必要があるレイアウトがあるとします。 app:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:src="@drawable/logo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

次の ViewStub を使用すると、読み込みを延期できます。 呼び出すには、参照するレイアウトを表示する必要があります。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/heavy_layout_we_want_to_postpone"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />
</FrameLayout>

ViewStub レイアウトを読み込む

前のセクションのコード スニペットでは、図のようなコードが生成されます。 1:

空白の画面の画像
図 1. 画面の初期状態: ViewStub 負荷の高いレイアウトを非表示にできます

ViewStub で指定されたレイアウトを読み込む場合、 または setVisibility(View.VISIBLE) または inflate()

次のコード スニペットは、延期された読み込みをシミュレートします。画面は ActivityonCreate() で通常通り、 heavy_layout_we_want_to_postpone レイアウトを使用します。

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_old_xml)

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000)
}

Java

@Override
void onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_old_xml);

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000);
}
図 2. 大きいレイアウトが表示されています。
で確認できます。
<ph type="x-smartling-placeholder">

表示またはインフレートが完了すると、ViewStub 要素は要素の一部ではなくなる ビュー階層の属性です。これは、インフレートされたレイアウトと、 そのレイアウトのルートビューは、android:inflatedId ViewStub の属性です。指定された ID android:id ViewStub は、ViewStub 表示またはインフレートできます。

<ph type="x-smartling-placeholder">

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