Memuat tampilan on demand

Terkadang tata letak Anda memerlukan tampilan yang kompleks yang jarang digunakan. Baik berupa detail item, indikator progres, maupun pesan urungkan, Anda dapat mengurangi penggunaan memori dan mempercepat rendering dengan memuat tampilan hanya jika diperlukan.

Anda dapat menunda pemuatan resource saat memiliki tampilan kompleks yang diperlukan aplikasi di masa mendatang dengan menentukan ViewStub untuk tampilan yang kompleks dan jarang digunakan.

Menentukan ViewStub

ViewStub adalah tampilan ringan tanpa dimensi yang tidak menggambar apa pun atau berpartisipasi dalam tata letak. Dengan demikian, diperlukan sedikit resource untuk meng-inflate dan meninggalkan hierarki tampilan. Setiap ViewStub menyertakan atribut android:layout untuk menentukan tata letak yang akan di-inflate.

Misalkan Anda memiliki tata letak yang ingin dimuat nanti di perjalanan pengguna aplikasi Anda:

<?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>

Anda dapat menunda pemuatan menggunakan ViewStub berikut. Agar menampilkan atau memuat apa pun, Anda harus membuatnya menampilkan tata letak yang dirujuk:

<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>

Memuat tata letak ViewStub

Cuplikan kode di bagian sebelumnya menghasilkan sesuatu seperti gambar 1:

Gambar layar kosong
Gambar 1. Status awal layar: ViewStub menyembunyikan tata letak yang berat.

Saat Anda ingin memuat tata letak yang ditentukan oleh ViewStub, tetapkan agar terlihat dengan memanggil setVisibility(View.VISIBLE) atau memanggil inflate().

Cuplikan kode berikut menyimulasikan pemuatan yang ditunda. Layar akan dimuat seperti biasa di Activity dan onCreate(), lalu menampilkan tata letak 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);
}
Gambar 2. Tata letak yang berat terlihat.

Setelah terlihat atau di-inflate, elemen ViewStub tidak lagi menjadi bagian dari hierarki tampilan. Elemen ini diganti dengan tata letak yang di-inflate, dan ID untuk tampilan root tata letak tersebut ditentukan oleh atribut android:inflatedId dari ViewStub. ID android:id yang ditentukan untuk ViewStub hanya valid hingga tata letak ViewStub terlihat atau di-inflate.

Untuk mengetahui informasi selengkapnya tentang topik ini, lihat postingan blog Mengoptimalkan dengan stub.