ViewStub
A ViewStub is a zero-sized invisible View which is used to load "layout resource" at runtime.
یعنی ViewStub ویویی بدون سایز و مخفی است که در زمان اجرا به عنوان layout نمایش داده خواهد شد . این یعنی اینکه با اضافه کردن این ویو به layout هیچ جایی رو نخواهد گرفت و زمانی که متد ()inflate یا visible آن اجرا شود ، یه ویو دیگر را در خود نمایش خواهد داد .
<ViewStub android:id="@+id/view_stub" android:inflatedId="@+id/replace_view" android:layout="@layout/replace_layout" android:layout_width="match_parent"
android:layout_height="match_parent"
/>
همانطور که در کد بالا می بینید attribute های ViewStub شامل موارد زیر می باشد :
android:id="@+id/view_stub"
id مختص خود ViewStub که بتوان بعدا در برنامه به آن دسترسی داشت
android:inflatedId="@+id/replace_view"
id ویویی که بعد از اجرای متد ()inflate یا visible به ویو جایگزین شده داده خواهد شد
android:layout="@layout/replace_layout"
layout ای که باید جایگزین شود . البته اینکار را بصورت کد نویسی انجام می دهیم تا بتوانیم همانند مثال گفته شده layout های اختصاصی را برای هر فرگمنت جایگزین کنیم
viewStub.setLayoutResource(R.layout.my_checkbox); View inflatedView = viewStub.inflate();
میتونید نحوه استفاده از ViewStub رو در اینجا و اینجا و اینجا و اینجا ببینید . با استفاده از ViewStub عملا ما میتونیم یک جایی اختصاصی جدا در layout در نظر بگیریم که برای هر فرگمنت یا اکتیویتی بتونه ویو مختص به خود رو در آن جایگزین کند . اما یکی از کاربرد های مهم دیگه ViewStub نیز لود کردن قسمت های مختلف layout در زمان های مختلفه . فرض کنید layout شلوغی داریم که اگر بخواهیم بصورت یکجا لود بشه زمان زیادی رو میگیره ، در این حالت با استفاده از ViewStub میشه زمان نمایش ویو رو تا زمان اجرای متد ()inflate یا visible به تاخیر بندازیم
پی نوشت : یکی از ویژگی های ViewStub اینه که زمان inflate شدن ، خود ViewStub حذف خواهد شد و جای آن را ویو تعریف شده خواهد گرفت در نتیجه زمان استفاده از ViewStub در ConstraintLayout بعد از inflate شدن دیگه هیچ قید و بندی به ConstraintLayout نخواهد داشت ، برای حل این مشکل کافیه همانند راه حل ارائه شده در اینجا ، inflatedId رو با id یک مقدار قرار بدیم .