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:
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); }
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.