این نوشته دومین و آخرین بخش از آموزش ابزار Navigation Component در برنامهنویسی اندروید هست، اگر با این ابزار آشنایی ندارید پیشنهاد میکنم قبل از خواندن این متن، نوشته رویکرد جدید؛ یک اکتیویتی برای هر اپلیکیشین کافیه (1) رو مطالعه کنید.
در بخش اول این آموزش در مورد اینکه ابزار Navigation چیه و چطوری کار میکنه حرف زدیم، در این نوشته به پیادهسازی دو مورد کاربردی دیگه در کار با Navigation میپردازیم:
لینک مثالهای این نوشته در گیتهاب:
۲. پیادهسازی BottomNavigationView با استفاده از Navigation
یکی دیگه از ویژگیهای Navigation، انتقال داده در زمان جابجایی بین Destination ها است. روش کار به این صورت که آرگومانی که میخواهیم از یک صفحه به صفحه بعدی ارسال بشه رو باید در فایل گراف مسیریابی معرفی کنیم. برای اینکار از تگ <argument> استفاده میکنیم تا در فایل گراف مسیریابی نوع داده، مقدار پیشفرض و نام متغیرمون رو مشخص کنیم. <argument> باید درون تگ Destination مقصد معرفی بشه.
اضافه کردن argument به صفحه Destination مقصد
تغییرات در محیط Design
تغییرات در محیط Text
ویژگیهای مهم argument:
android:name
یک نام منحصر به فرد برای آرگومان انتخاب میکنیم تا بعدا با استفاده از این نام به مقدار اون دسترسی پیدا کنیم.
app:argType
نوع دادهای متغیر
android:defaultValue
مقدار پیشفرض متغیر
لیستی از انواع تایپهای دادهای که Navigation اونها رو پشتیبانی میکنه: لینک
خب حالا میرسیم به قسمت اصلی کار، یعنی ارسال دادهها. تاحالا هیچ دادهای ارسال نکردیم فقط یک سری سیاست در گراف مسیریابی مشخص کردیم و گفتیم قراره از این صفحه به فلان صفحه، داده هایی با این ویژگیها ارسال بشه.
برای ارسال و دریافت مقادیر بین صفحات باید از پلاگین Safe Args استفاده کنیم. این پلاگین برای دسترسی امن به آرگومانهای گراف مسیریابی طراحی شده و روش کارش هم به این صورت که براساس آرگومانهای ارسال شده، Destination های مبدا و مقصد یک مجموعه کلاس به صورت اتوماتیک تولید میکنه و کاربر با استفاده از این کلاسها میتونه مقادیر رو برای ارسال در صفحه مبدا مشخص کنه یا در مقصد اونها رو دریافت کنه.
اضافه کردن Safe Args به پروژه:
۱. تغییرات در فایل ریشه (top-level) build.gradle:
۲. فعال سازی پلاگین در فایلbuild.gradle(app):
گفتیم روش کار Safe Args به این صورت که یه سری کلاس، متد و فیلد رو براساس سیاستهای گراف مسیریابی تولید میکنه. حالا میخواهیم کمی بیشتر وارد جزئیات این کار بشیم. به طور کلی Safe Args براساس سه پارامتر مهم (در گراف مسیریابی)کلاس یا متد تولید میکنه. Destination مبدا، Destination مقصد و Action مرتبط.
۱. ارسال مقدار آرگومان در Destination مبدا:
با استفاده از دستور ()FragADirections.actionNavigateToFragmentB یک نمونه از کلاس ActionNavigateToFragmentB میسازیم و از این طریق به تگ <action> ای که در گراف مسیریابی ساختیم دسترسی پیدا میکنیم. در آخر هم از شی NavController استفاده میکنیم تا عملیات انتقال رو نهایی کنیم.
۲. دریافت مقدار ارسال شده در Destination مقصد
دریافت داده از ارسال اون هم ساده تره، فقط باید از کلاس FragmentBArgs و یک Bundle استفاده کنید تا به مقدار ارسال شده دسترسی پیدا کنید.
علاوه بر مثالهایی که در این دو نوشته دیدیم Navigation قادر به پیادهسازی ویوهای پیچیدهتری هم هست. ویوهایی مثل BottomNavgationView، NavigationDrawer، CollapsingToolbarLayout و .. . Navigation برای پیادهسازی این ویوها از کلاس کمکی NavigationUI استفاده میکنه. در بخش انتهایی این مقاله میخواهیم یک نمونه از پیادهسازی چنین طرحهایی رو با استفاده از NavigationUI ببینیم.
لیستی از مواردی که برای این پیادهسازی نیاز داریم:
۱. یک Activity که نقطه شروع برنامه است و در layout این اکتیویتی NavHost و BottomNavigationView رو قرار داده میشود.
۲. معرفی چند فرگمنت به گراف مسیریابی به عنوان Destination ها
۳. طراحی یک menu برای استفاده در BottomNavigationView
نکته مهم: توجه کنید آیدی هر Item در این menu حتما با آیدی Destination مرتبط با خودش یکسان باشد!
۴. دسترسی به شی NavController در اکتویتی
۵. و درنهایت برقراری اتصال بین BottomNavigationView و NavController
همونطوری که در تکه کد بالا مشخصه برای اتصال BottomNavigationView به NavController از کلاس جانبی NavigationUI استفاده میکنیم. NavigationUI کمک میکنه تا ویوهایی مثل NavigationDrawer، BottomNavigationView و .. رو به سادگی پیاده کنیم.
با استفاده از متد setupWithNavController() امکان اتصال BottomNavigationView به NavController فراهم میشه. روش کارش هم به این صورتِ که بعد از اتصال، NavigationUI همیشه در حال گوش دادن به رویداد OnNavigationItemSelected() میمونه (این رویداد وقتی اجرا میشه که کاربر یکی از آیتمهای BottomNavigationView رو انتخاب/لمس کنه)، هر زمانی که این رویداد اجرا شه NavigationUI آیدی MenuItem ای که کاربر روی اون لمس کرده رو دریافت میکنه و با استفاده از شی NavController صفحه مرتبط با آیتم انتخاب شده رو به کاربر نمایش میده. به همین خاطر که باید آیدی MenuItem ها با آیدی Destination ها یکسان باشند.
در جمع بندی باید بگم Navigation ابزار بسیار ساده و در عین حال قدرتمندیه که اجازه دستیابی به رویکرد Single Activity Per Application رو به برنامه نویسان اندروید میده. پس اگر به این رویکرد علاقهمند هستید، پیشنهاد میکنم از این ابزارغافل نشید.
امیدوارم این مجموعه آموزشها برای شما مفید بوده باشه. اگه سوال، انتقاد یا پیشنهادی دارید میتونید یا زیر همین پست مطرح کنید یا از طریق توئیتر و تلگرام با من در تماس باشید. (: