مرتضی دلیل
مرتضی دلیل
خواندن ۴ دقیقه·۵ سال پیش

لی اوت در اندروید ۱۶(قسمت آخر) : استفاده از 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
برخی ویژگی های 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 قسمتی در مورد لی اوت در اندروید رسیدیم. ممنونم که در این دو سه هفته این مطالب رو دنبال کردید.

مشتاقم نظرات شما رو بدونم.

برنامه نویسیandroid layoutآموزش viewstubآموزش لی اوت اندروید
برنامه نویس و علاقمند به برنامه نویسی، سینما، فلسفه و هر چیزی که هیجان انگیز باشد. در ویرگول از روزمرگیهای مرتبط با علاقمندیهام خواهم نوشت. در توئیتر و جاهای دیگر @mortezadalil هستم.
شاید از این پست‌ها خوشتان بیاید