گوگل در androidx کامپوننتی را معرفی کرده که بسیار در پیاده سازی ارتباط صفحات رابط کاربری ، کاربرد دارد . کامپوننت Navigation سعی خواهد کرد با ارائه ابزار هایی نحوه ارتباط و پیمایش بین صفحات و انتقال اطلاعات بین انها را کنترل کند . توصیه گوگل نیز استفاده از معماری single activity در زمان استفاده از این کامپوننت است . یعنی یک اکتیویتی با چندین فرگمنت که صفحات مختلف برنامه را خواهد ساخت . در این مطلب بصورت پایه سعی میکنم نحوه استفاده از Navigation را توضیح بدهم .
قبل از هر چیز باید dependency را اضافه کنید
buildscript {
ext.nav_version = '2.3.4'
}
implementation "androidx.navigation:navigation-fragment-ktx:${nav_version}"
اولین قدم تعریف گراف پیمایش است ، جایی که مسیر ها تعریف میشود ، برای اینکار روی پوشه res راست کلیک کرده و بصورت زیر فایل nav_graph را اضافه میکنیم :
با کلیک روی nav_graph صفحه ادیتور باز خواهد شد که میتوان فرگمنت های برنامه را به عنوان destination اضافه کرد .
همچنین با کشیدن از یک فرگمنت به فرگمنت دیگر یک action ایجاد خواهد شد که همان مسیر حرکت بین فرگمنت هاست . با استفاده از id که برای action تعریف میشود میتوان بعدا دستور رفتن به صفحه بعد را صادر کرد :
میتوانید کد قسمت nav_graph را بعد از افزودن action به صورت زیر ببینید . همانطور که مشخص است این گراف نیز از یک فایل xml تشکیل شده که تمام مشخصات گفته شده در ان وجود دارد
در مرحله بعد باید فضایی در اکتیویتی تعریف شود که محل بکار گیری گراف و نمایش فرگمنت ها در ان است .این مکان با نام nav_host به صورت زیر به layout اکتیویتی اضافه خواهد شد :
<fragment android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" />
حال برای جابجایی بین فرگمنت ها کافی است از nav_controler بصورت زیر در فرگمنت مبدا استفاده کرد . در کد با استفاده از متد navigate و id همان action که قبلا تعریف کردیم به راحتی به فرگمنت بعدی پیمایش خواهیم کرد :
findNavController().navigate(R.id.action_mainFragment_to_listFragment)
بطور معمول علاوه بر پیمایش بین فرگمنت ها نیاز به تبادل اطلاعات بین انها نیز میباشد ، بطور مثال کاربر روی یک کالا کلیک کرده و در صفحه بعد طبق شناسه کالا جزئیات ان نمایش داده خواهد شد . گوگل برای اینکار توصیه میکند از SafeArgs استفاده کنید. برای اینکار ابتدا در قسمت build.gradle مربوط به module کد زیر را اضافه میکنیم :
dependencies { classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" }
سپس در build.gradle مربوط به app کد زیر را اضافه خواهیم کرد. حتما پس از اینکار یکبار پروژه را clean و سپس rebuild کرده تا اندروید استودیو کلاس های مورد نیاز را بصورت خودکار بسازد :
plugins { id 'androidx.navigation.safeargs.kotlin' }
قبل از شروع ابتدا باید در nav_graph برای فرگمنتی که دریافت کننده اطلاعات است در قسمت Argument یک متغییر را تعریف کنید
سپس در فرگمنت ارسال کننده ، با استفاده از کلاس ساخته شده توسط SafeArgs که از نام فرگمنت + Directions تشکیل شده و متد هایی با نام action که از قبل ساخته این اطلاعات مورد نظر را بصورت پارامتر می فرستیم
val action = MainFragmentDirections.actionMainFragmentToListFragment(count) findNavController().navigate(action)
در فرگمنت دریافت کننده نیز به سادگی با استفاده کلاس ساخته شده که ترکیب نام فرگمنت +Args تشکیل شده استفاده کرده و بصورت زیر اطلاعات را دریافت کرده و استفاده خواهیم کرد
val count = ListFragmentArgs.fromBundle(requireArguments()).listCount
امیدارم مفید واقع شود