اصول برنامه نویسی و طراحی میگه تا حد امکان باید از کد های تکراری بپرهیزیم و اینکار برای طراحی رابط کاربری هم بسیار مورد نیازه. یه مثال ساده ای که در این مورد همیشه زده میشه جداسازی کد های یک قسمت طراحی بصورت یک فایل جدا layout و استفاده از اون در layout های دیگه است که میشه با تگ های include , merge اون قسمت رو اضافه کرد. البته اگر قسمت ضمیمه شونده منطق خودش رو داشته باشه باید بصورت fragment به اکتیویتی اضافه بشه تا بتونیم برای هر قسمت منطقش رو اجرا کنیم. اینکار هم با تگ fragment , framelayout قابل انجامه. در چنین مثالهایی ما یک بخش داریم که میتونه در فضاهای بزرگ دیگه مثل فرگمنت یا اکتیویتی تکرار بشه حالا بزارید یه فرض دیگه رو هم بررسی کنیم. اگر ساختار اصلی فرگمنت هامون یک شکل باشه ولی یه بخش خاص برای هر فرگمنت تغییر کنه چطور؟ یعنی فرض کنید چند فرگمنت یا اکتیویتی داریم که شکل ساختاری یکسانی دارند ولی مثلا بخش بالای صفحه در هر فرگمنت متفاوته و شکلش تغییر میکنه. اینجاست که ViewStub به کار میاد. بزارید اول بدونیم ViewStub چیه؟ ViewStub طبق تعریف خود گوگل: یعنی ViewStub ویویی بدون سایز و مخفی است که در زمان اجرا به عنوان layout نمایش داده خواهد شد. این یعنی اینکه با اضافه کردن این ویو به layout هیچ جایی رو نخواهد گرفت و زمانی که متد یا آن اجرا شود، یه ویو دیگر را در خود نمایش خواهد داد. همانطور که در کد بالا می بینید attribute های ViewStub شامل موارد زیر می باشد: یک id مختص خود ViewStub که بتوان بعدا در برنامه به آن دسترسی داشت یک id که بعد از اجرای متد یا به ویو جایگزین شده داده خواهد شد همان layout ای که باید جایگزین شود. البته اینکار را بصورت کد نویسی انجام می دهیم تا بتوانیم همانند مثال گفته شده layout های اختصاصی را برای هر فرگمنت جایگزین کنیم میتونید نحوه استفاده از ViewStub رو در و و و ببینید. با استفاده از ViewStub عملا ما میتونیم یک جایی اختصاصی جدا در layout در نظر بگیریم که برای هر فرگمنت یا اکتیویتی بتونه ویو مختص به خود رو در آن جایگزین کند. اما یکی از کاربرد های مهم دیگه ViewStub نیز لود کردن قسمت های مختلف layout در زمان های مختلفه. فرض کنید layout شلوغی داریم که اگر بخواهیم بصورت یکجا لود بشه زمان زیادی رو میگیره، در این حالت با استفاده از ViewStub میشه زمان نمایش ویو رو تا زمان اجرای متد یا به تاخیر بندازیم پی نوشت: یکی از ویژگی های ViewStub اینه که زمان شدن، خود ViewStub حذف خواهد شد و جای آن را ویو تعریف شده خواهد گرفت در نتیجه زمان استفاده از ViewStub در ConstraintLayout بعد از شدن دیگه هیچ قید و بندی به ConstraintLayout نخواهد داشت، برای حل این مشکل کافیه همانند راه حل ارایه شده در، inflatedId رو با id یک مقدار قرار بدیم. منبع: