برای جابه جایی کاربر در قسمت های مختلف برنامه (معمولا جا به جایی بین Fragment ها) از Navigation استفاده می کنیم
توجه:
هنگام استفاده از navigation توصیه میشه سیاست تک activity و چند فرگمنتی رو به کار ببرید یعنی تنها یک activity داریم و کاربر فقط بین fragment ها جا به جا میشه
توجه:
در این مقاله فرض بر این شده با Fragment, Activity و مباحث پایه ای اندروید آشنایی دارید.
مزایای استفاده از Navigation
۱-کنترل تراکنش بین fragment ها
۲-کنترل عملگر های Up و Back در برنامه
۳-تهیه ی منابع استاندارد برای استفاده از انیمیشن ها
۴-اجرا و کنترل Deep Link
۵-قابلیت استفاده از پلاگین Safe-Args برای پاس دادن داده ها بین Fragment ها به صورت امن
۶-پشتیبانی مناسب از ViewModel
خب بریم ببینیم چه خبره!
پلاگین ها و کتابخونه های مورد نیاز
افزودن Navigation به پروژه
RootProject -> app -> build.gradle
افزودن پلاگین safe-args به پروژه
از safe-args برای فرستادن متغیر ها از یک فرگمنت به فرگمنت دیگه استفاده میشه
RootProject -> build.gradle
RootProject -> app -> build.gradle
برای جا به جایی بین فرگمنت ها با Navigation باید کار های زیر را انجام بدیم:
- ایجاد فایل Navigation Graph و ترسیم مسیر های بین فرگمنت ها.
- تعریف NavHost معمولا در main_activity تعریفش می کنیم.
- جابه جایی با استفاده از NavController (معمولا NavController رو با استفاده از متد findNavController در Fragment, Activity یا View صدا می زنیم).
Navigation Graph
یک فایل xml که تمامی مقصد ها و مسیر های بین فرگمنت ها رو داخلش ترسیم میکنیم این فایل باید در مسیر زیر ایجاد بشه:
RootProject -> app -> src -> main -> res -> navigation
فایل Navigation Graph دارای عناصر زیر است:
1- navigation
عنصر navigation ریشه ی Navigation Graph است بقیه ی عناصر فرزندان این عنصر هستند این عنصر باید دارای دو فیلد id و startDestination باشه
فیلد id شامل ای دی برای navigation است.
فیلد startDestination شامل آی دی فرگمنتیه که به عنوان نقطه ی شروع در نظر گرفته میشه.
2- fragment
با استفاده از این عنصر destination ها رو تعریف میکنیم
به این عنصر destination هم گفته میشه.
فیلد id شامل آی دی برای fragment است
فیلد name شامل اسم کلاس Fragment مورد نظر است.
فیلد label شامل اسم برچسب برای destination است.
در فیلد layout که اختیاریه ادرس فایل xml مربوط به Fragment در layout رو میدیم.
3- action:
زمانی که میخوایم یک مسیر بین fragment ها تعریف کنیم این عنصر رو به عنوان فرزند fragment اولی تعریف میکنیم.
فیلد id شامل آی دی برای action است.
فیلد destination شامل آی دی fragment دومی است.
نکته:
برای این عنصر فیلد های انیمیشنی ام وجود داره که هنگام جا به جایی بین فرگمنت ها میشه از انیمیشن استفاده کرد ولی ما برای اختصار ازشون صرف نظر کردیم
4- argument:
زمانی که کاربر میخواد بین فرگمنت ها جا به جا بشه با این عنصر میتونیم داده های primary, string و object هایی از جنس parcelable رو از فرگمنت اولی به فرگمنت دومی منتقل کنیم این عنصرو باید به عنوان فرزند action تعریف کنیم
فیلد name شامل اسم دلخواه برای داده مورد نظر است.
فیلد argType شامل نوع داده ایست که میخوایم از اولی به دومی منتقل کنیم.
با فیلد nullable تعیین میکنیم که داده ی مورد نظر برای انتقال میتونه null باشه یا خیر که نوعش boolean است.
مثال:
فرض کنید دوتا Fragment داریم و میخوایم کاربر از اولی به دومی جا به جا بشه فرگمنت اول رو به عنوان نقطه ی شروع در نظر میگیریم.
ابتدا یک فایل با اسم دلخواه در مسیر زیر ایجاد میکنیم
Root Project -> resources -> navigation -> filename.xml
سپس مانند نمونه ی زیر destination ها و مسیر های بینشونو تعریف میکنیم:
اگه کد هاتون مثل بالا باشه مانند تصویر زیر را باید در تب design ببینید

همانطور که مشاهده می کنید firstFragment به عنوان startDestination تعریف شده و علامت خانه است فلش از firstFragment به secondFragment هم مسیریه که با عنصر action تعریف کردیم.
نکته:
میتونید بجای نوشتن کد های xml به صورت ویژوال هم در قسمت design این کارا رو بکنید اما برای درک درست تر بهتره که با xml مسیر ها و destination ها رو تعریف کنید.
NavHost
به عنوان میزبان fragment ها زمانی که کاربر بخواد از یک فرگمنت به فرگمنت دیگه ای جا به جا بشه فرگمنت اولی از NavHost خارج میشه و فرگمنت دومی برای نمایش داخل NavHost جایگزین میشه معمولا NavHost رو داخل main_activity تعریف میکنند
فیلد id شامل آیدی برای NavHost است.
فیلد name شامل اسم کلاس NavHostFragment است.
فیلد navGraph شامل اسم Navigation Graph تعریف شده در پوشه ی navigation است.
فیلد defaultNavHost میگه NavHost تعریف شده به عنوان پیشفرض در نظر گرفته بشه.
NavController
وظیفه ی مدیریت جا به جایی کاربر بین fragment ها رو داره وقتی بخوایم کاربر از یک فرگمنت به فرگمنت
دیگه ای جا به جا بشه با استفاده از این کلاس میتونیم این جا به جایی رو انجام بدیم این کلاس رو میتونیم
با استفاده از متد ()findNavController در activity, fragment یا view صدا بزنیم و ازش استفاده کنیم
اگر در Navigation Graph داخل عنصر fragment حداقل یک عنصر action تعریف کنیم اندروید استادیو خودکار
کلاس FragmentDirections مربوط به فرگمنت مورد نظرو میسازه این کلاس متد های مرتبط با عنصر های action
ایجاد شده رو برای جا به جایی با استفاده از متد navigate در کلاس NavController را در بر داره
مثال:
برای اینکه بخوایم کاربر با زدن یک کلید از یک فرگمنت به فرگمنت دیگه ای بره مثل زیر عمل می کنیم
در اینجا کلاس FirstFragmentDirections خودکار توسط اندروید استادیو ساخته شده همونطور که گفته شد این کلاس زمانی ساخته میشه که حداقل یک عنصر اکشن داخل عنصر fragment مورد نظر در فایل Navigation Graph تعریف کرده باشیم متد fromFirstFragmentToSecondFragment هم بر اساس id که برای action تعریف میکنیم ایجاد میشه اگه بخوایم داخل عنصر action عنصر argument تعریف کنیم این متد حاوی پارامتر هایی میشه که از جنس argument های تعریف شده داخل عنصر اکشن هستند
تا اینجای کار با موارد ضروری جهت پیادهسازی Navigation در پروژه اشنا شدیم امیدوارم بدردتون بخوره روزاتون پر کد کداتون پر پول 😎