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