Memuat tampilan on demand

Terkadang tata letak Anda memerlukan tampilan kompleks yang jarang digunakan. Apakah berupa detail item, indikator kemajuan, atau pesan urungkan, Anda dapat mengurangi penggunaan memori dan mempercepat rendering dengan memuat tampilan hanya saat tampilan diperlukan.

Anda bisa menunda pemuatan resource saat aplikasi Anda memiliki tampilan kompleks kebutuhan di masa depan dengan menentukan ViewStub untuk tampilan yang kompleks dan jarang digunakan.

Menentukan ViewStub

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

Misalkan Anda memiliki tata letak yang ingin Anda muat nanti dalam {i>user journey<i} aplikasi:

<?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. Untuk membuat kode itu 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 1:

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

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

Cuplikan kode berikut menyimulasikan pemuatan yang ditunda. Layar akan dimuat sebagai seperti biasa di Activity dan onCreate(), maka akan muncul 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 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 ditetapkan oleh android:inflatedId dari ViewStub. ID android:id yang ditentukan untuk ViewStub hanya berlaku hingga ViewStub terlihat atau di-inflate.

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