لی اوت در اندروید ۱۶(قسمت آخر) : استفاده از ViewStub

این مقاله به همراه دیگر مقالات این مجموعه ۱۶ قسمتی، بر اساس آموزش ویدیویی در pluralsight به نام Android Fundamental : Layout تهیه شده است. تاریخ تولید این دوره ۲۰۱۹ است.روند منبع فوق در فهرست و محتوای مقالات، بطور کلی حفظ شده است ولی در جزئیات یک ترجمه کلمه به کلمه نیست؛ نگارش فهرست و محتوا با افزودن و دخالت همراه بوده است.بطور کلی هر جا حس شده توضیح بیشتر به درک مطلب کمک می‌کند دریغ نشده است.لی اوت در اندروید ۱ : مفاهیم اولیهلی اوت در اندروید ۲ : آشنایی با اتریبیوت های width و height لی اوت در اندروید ۳ : آشنایی با اتریبیوت های margin و padding لی اوت در اندروید ۴ : آشنایی با اتریبیوت gravity لی اوت در اندروید ۵ : آشنایی با لی اوت های پایهلی اوت در اندروید ۶ : آشنایی با LinearLayout لی اوت در اندروید ۷ : اتریبیوت weightلی اوت در اندروید ۸ : آشنایی با FrameLayoutلی اوت در اندروید ۹ : آشنایی با RelativeLayout لی اوت در اندروید ۱۰: آشنایی با CoordinateLayout لی اوت در اندروید ۱۱ : آشنایی با ConstraintLayoutلی اوت در اندروید ۱۲ : آشنایی با Layout Inspectorلی اوت در اندروید ۱۳ : بهینه سازی رابط کاربری لی اوت در اندروید ۱۴ : استفاده از تگ include لی اوت در اندروید ۱۵ : استفاده از تگ merge لی اوت در اندروید ۱۶ : استفاده از ViewStub (قسمت آخر) (در حال خواندن این مقاله هستید) در صفحه ممکن است ویوهایی باشد که به ندرت توسط کاربر در ران تایم استفاده میشوند.مثلا در مثال زیر ویوی نمایش داده شده از این نوع ویوهاست.یا ویوی زیر را در نظر بگیرید که ممکن است توسط کاربر در شرایط خاص استفاده شوددر این شرایط چون امکان این وجود دارد که ویویی در صفحه توسط کاربر استفاده نشود. بهتر است آنهارا زمانی لود کنیم که واقعا نیاز داریم..اندروید به محض اینکه یک ویو را در صفحه include میکند، مقداری حافظه به آن اختصاص میدهد و باعث کند شدن ui میشود و اگر کاربر از آن بخش ویو استفاده نکند در حقیقت ما memory را هدر داده ایم.برای برقراری امکان lazyload برای ویوها، ما یک کلاس ویژه برای اینکار در اندروید داریم به نام viewStub.(لیزی لود، یعنی زمانی لود شدن و اشغال حافظه صورت گیرد که بخش مورد نظر دیده شود؛ پس تا زمانی که دیده نشود و بلااستفاده باشد آن بخش در حافظه لود نشده است)اما ویو استاب چیست؟یک ویوی سبک بدون ابعاد که برای کاربر به شکل invisible است و تغییری روی لی اوت ایجاد نمیکند و در ران تایم میتوانید این ویو را با لی اوت مورد نظر جایگزین کنید.برای ویزیبل شدن این ویو یا inflate کردن آن، ویواستاب با ویوی مورد نظر شما جایگزین میشود. پس لیزی لودینگ برقرار شده چون فقط زمانی که نیاز است ما ویوی مورد نظر را inflate میکنیم.اینکار باعث کاهش استفاده از مموری میشود. چون ویو زمانی که نیاز است لود میشود.برخی ویژگی های ViewStubچطور استفاده کنیم؟یک ویو درست میکنیم که شامل پروگرس بار باشدهر دو آیتم id دارند.فایل اصلی ما به شکل زیر است. که دو دکمه دارد و یک تگ ViewStub هم در آن تعریف شده است.برای دو دکمه هم به شکل زیر هندلر تعریف میکنیم:متدهای مرتبط با دکمه هاقرار است در ران تایم فایل progress_bar.xml جایگزین ViewStub شود.فایل اصلی ماست، هایلایت زرد نشان میدهد که لی اوت این ویواستاب چیست.ویواستاب یک آی دی دارد و لوکیشن آن در مرکز صفحه تنظیم شده است.همانطور که میبینید قیودی برای این ویواستاب تعریف شده است با جایگزینی در ران تایم این قیود روی ویوی جدید اعمال میشود.آی دی این ویو استاب تا زمانی که با پراگرس بار جایگزین شود ولید است. یعنی دسترسی به این آی دی از طریق کد موجب اکسپشن میشود.با توجه به این مطالب کد مرتبط را در فایل main مینویسیم:ِاین کد میگوید که به المان با آی دی view_stub چیزی inflate کن ، دقت کنید که ویواستاب میداند چه لی اوتی قرار است جایگزین آن شود و در اتریبیوت layout ِآن مشخص کردیم، نمونه ایجاد شده را در progressBarLayout بریز.در inspector تا همینجا خروجی زیر را خواهیم دیدبا کلیک روی دکمه خواهیم داشت:اگر دوباره inspect کنیم خروجی به شکل زیر است و سلسله مراتب تغییر کرده:اگر دوباره روی دکمه show progress bar کلیک کنیم برنامه کرش میکند، چون id ویواستاب دیگر وجود ندارد.در لاگ میبینیم که ما فانکشن inflate را روی یک آبجکت نال فراخوانی کردیم! چون دیگر نمونه view_stub وجود ندارد و با لی اوت مربوط به پراگرس بار جایگزین شده است.بخش هایلایت شده در کد فوق نال میشود.عبارت فوق را به شکل زیر اصلاح میکنیمرفع مشکل نال شدگییعنی اگر بخش اول نال نبود inflate را اجرا کن در غیر اینصورت کاری نکن.مشکل حل میشود. برای هاید کردن هم به شکل زیرعمل میکنیم.اگر برنامه را اجرا کنیم، دفعه اول با کلیک روی دکمه اول show میکند و سپس با کلیک hide میشود ولی دفعه بعد show نمیکند.چون کد مربوط به showProgressbar فقط یکبار کار میکند.در بار دوم چون view_stub نداریم نال میشود و در دفعات بعد خود پراگرس بار وجود دارد و باید با همان کار کرد. به شکل زیر کد را اصلاح میکنیمدر دفعات بعد حذف و اضافه کردن واقعی صورت نمیگیرد و فقط عملیات ویزیبل و اینویزیبل صورت میگیرد.به پایان این دوره 16 قسمتی در مورد لی اوت در اندروید رسیدیم. ممنونم که در این دو سه هفته این مطالب رو دنبال کردید.مشتاقم نظرات شما رو بدونم.