مقدمه آموزش اندروید پیشرفته
Fragment یک مبحث مهم در آموزش اندروید پیشرفته است. قطعه، فرگمنت یا Fragment یک کامپوننت از Android است که بخشی از رفتار و یا رابط کاربری یک Activity را در خود جای میدهد. همانطور که از نام آن پیداست، Fragmentها موجودیتهای مستقلی نیستند، بلکه به یک Activity منفرد گره خورده اند. از بسیاری جهات، فرگمنت ها عملکردی مشابه Activity ها دارند.
تصور کنید که شما یک کارفرمای بزرگ هستید و مشغلههای زیادی برای انجام دادن دارید، ممکن است در ازای کارهای ساختمانی، اداری و امور مالیاتی و غیره چند کارمند را برای انجام امور ذکر شده، استخدام کرده باشید تا فعالیت های شما را به نحو احسن جلو ببرند. این مثال درواقع به نوعی مانند رابطه بین Activity و Fragment است. که Activity همان کارفرما و Fragment همان کارمندان هستند و در نهایت این Fragment ها به Activity برای اجرای صحیح پروژه ها در حیطه وظایف خودشان کمک می کنند.
اگر پروژه های بزرگ یا پیچیده انجام نمیدهید، لازم نیست از Fragment استفاده کنید ولی در پروژه های بزرگ مجبور خواهید بود تا قسمت های مختلف پروژه خودتان را با Fragment کردن انجام دهید. فرگمنت ها می توانند مزایای خوبی را ارائه دهند:
- ماژولاریتی Modularity: تقسیم کد Activity پیچیده در قطعات برای سازماندهی و نگهداری بهتر.
- قابلیت استفاده مجدد Reusability: قرار دادن رفتار یا بخش های رابط کاربری در قطعاتی که چندین Activity می توانند به اشتراک بگذارند.
- سازگاری Adaptability: نمایش بخشهای یک رابط کاربری به عنوان قطعات مختلف و استفاده از طرحبندیهای مختلف بسته به جهت و اندازه صفحه نمایش.
در این آموزش، شما یک پایگاه داده کوچک از سگها میسازید که لیستی از نژادهایی را که در یک شبکه مرتب شدهاند را نمایش میدهد. هنگامی که کاربر نژادی را انتخاب میکند، برنامه اطلاعات مربوط به آن را نمایش میدهد. از طریق ساخت این برنامه یاد خواهید گرفت که چگونه:
- ایجاد و اضافه کردن Fragment به یک Activity چگونه انجام می شود.
- چگونه Fragmentها اطلاعاتی را به یک Activity ارسال می کنند.
- با استفاده از تراکنش ها (transactions)، Fragmentها را اضافه و جایگزین کنید.
در این آموزش فرض بر این که با اصول اولیه برنامهنویسی اندروید آشنا هستید و مفهوم چرخه حیات فعالیت را میدانید. اگر با اندروید کاملاً تازه کار هستید، می توانید آموزش برنامه نویسی اندروید (Android) با پایتون را از مجموعه پی استور دانلود کنید.
شروع کار با Fragment اندروید
در ادامه آموزش، کار را با ایجاد اولین پروژه آغاز میکنیم. برای شروع کار، فایل لازم برای متریالها را از اینجا (+) دانلود کنید و پس از Extact کردن، پوشه Starter را از طریق Android Studio باز یا Import کنید.
پس از اینکه فایلهای دانلودی به طور کامل لود شدند منتظر بمانید تا دیگر وابستگیهای لازم سیستم اندروید استادیو نیز دانلود و نصب شود. اگر برنامه بخوبی باز شود میتوانید پروژه را با نام ElDogo بررسی کنید. در این پروژه میتوانید برخی از فایلهای منبع را همچون strings.xml، activity_main.xml، drawable و layout را مشاهده کنید.
MainActivity همه فرگمنتهای کوچک شما را میزبانی میکند و DogListFragment حاوی کد برای نمایش لیستی از نژاد سگها است تا بتوانید روی فرگمنتها تمرکز کنید. پس از built کردن پروژه آن را اجرا کنید:
در اولین خروجی از پروژه حتماً متوجه خواهید بود که برنامه خیلی ساده است ولی جای نگرانی نیست خیلی سریع ادامه پروژه را جلو خواهیم رفت پس با ادامه آموزش اندروید پیشرفته با ما همراه باشید.
چرخه حیات فرگمنت اندروید در آموزش اندروید پیشرفته
مانند یک Activity، یک Fragment دارای چرخه حیات با رویدادهایی است که هنگام تغییر وضعیت Fragment رخ میدهد. به عنوان مثال، یک رویداد زمانی رخ میدهد که Fragment قابل مشاهده و فعال میشود، یا زمانی که Fragment بدون استفاده میشود و حذف میشود. همچنین میتوانید همانند یک Activity، کد و رفتارهایی را برای این رویدادها callback کنید. نمودار چرخه حیات Fragment بصورت زیر خواهد بود:
با اضافه کردن یک Fragment، رویدادهای چرخه حیات زیر وارد عمل میشود:
- onAttach: فرگمنت به Activity میزبان خود متصل میشود.
- onCreate: یک نمونه Fragment جدید مقداردهی اولیه میشود، که همیشه پس از اتصال به میزبان اتفاق میافتد.
- onCreateView: یک Fragment بخشی از سلسله مراتب view را ایجاد می کند که به سلسله مراتب نمای Activity آن اضافه میشود.
- onActivityCreated: فعالیت Fragment رویداد onCreate خودش را به پایان رسانده است.
- onStart: فرگمنت قابل مشاهده است. یک Fragment فقط پس از شروع Activity شروع می شود.
- onResume: فرگمنت قابل مشاهده و قابل تعامل است. یک Fragment تنها پس از از سرگیری Activity آن از سر گرفته میشود.
- onPause: فرگمنت دیگر قابل تعامل نیست. این عمل زمانی اتفاق میافتد که یا Fragment در شرف حذف یا جایگزینی است یا زمانی که فعالیت Fragment متوقف میشود.
- onStop: فرگمنت دیگر قابل مشاهده نیست. این اتفاق یا پس از حذف یا جایگزینی Fragment یا زمانی که فعالیت Fragment متوقف می شود رخ میدهد.
- onDestroyView: نما و منابع مرتبط ایجاد شده در onCreateView از سلسله مراتب نمای اکتیویتی حذف شده و از بین میروند.
- onDestroy: فرگمنت پاکسازی نهایی خود را انجام میدهد.
- onDetach: فرگمنت از فعالیت خود جدا میشود.
همانطور که می بینید، چرخه حیات Fragment با چرخه حیات Activity در هم تنیده میشود. اما رویدادهای اضافی دارد که به سلسله مراتب نمای Fragment، حالت و پیوست به Activity آن اختصاص دارد.
کتابخانه پشتیبانی V4
در اندروید هنگام استفاده از فرگمنتها، دو پیاده سازی فرگمنت جایگزین وجود دارد که میتوانید از آنها استفاده کنید. یک نوع فرگمنت ای است که توسط نسخه پلتفرم ارائه شده است. نسخه پلتفرم مربوط به نسخه اندرویدی است که کاربر در حال اجرا است. به عنوان مثال، دستگاهی که Android نسخه ۶.۰، SDK نسخه ۲۳ را اجرا می کند، پلتفرم نسخه ۲۳ کتابخانه را اجرا می کند.
نوع دوم یک فرگمنت کتابخانه پشتیبانی است. هنگامی که یک کتابخانه پشتیبانی اضافه میکنید، استفاده از کتابخانه پشتیبانی دو مزیت در هنگام توسعه برنامههای کاربردی برای چندین نسخه اندروید دارد. اول، تضمین میکند که کد و توابع خود در دستگاههای مختلف و نسخههای پلتفرم سازگاری داشته باشید. این بدان معنی است که اشکالات و رفع اشکال در نسخه های مختلف اندروید با استفاده از این کتابخانهها سازگارتر خواهد بود. دوم، هنگامی که ویژگیهای جدیدی را به آخرین نسخه اندروید اضافه میکنید، تیم Android اغلب این ویژگیها را از طریق کتابخانه پشتیبانی به منظور توسعهدهندگان برای استفاده در نسخههای قدیمیتر اندروید، به عقب منتقل میکند. پس، از کدام کتابخانه باید استفاده کنید؟
Android دارای Fragment پلت فرم منسوخ در Android 9.0، SDK نسخه ۲۸ است. بنابراین هنگام استفاده از Fragment ها، همیشه باید از کتابخانه پشتیبانی v4 استفاده کنید.
ایجاد یک Fragment
در پروژه باز شده می توانید روی هر یک از موارد، جزئیات مربوط به آموزش را مشاهده کنید. فایل fragment_dog_details.xml را در زیر app▸ src ▸ main▸ res ▸ layout پیدا کنید. این فایل XML نمایش جزئیات سگ ها را نشان خواهد داد و یکی از منابع drawble و String مرتبط را نمایش می دهد.
فایل DogDetailsFragment.ky را در پروژه پیدا کنید. این کلاس مسئول نمایش جزئیات برای یک نژاد انتخابی خواهد بود. در DogDetailsFragment.kt، کد به صورت زیر است:
import android.os.Bundle import android.support.v4.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup //۱ class DogDetailsFragment : Fragment() { //۲ companion object { fun newInstance(): DogDetailsFragment { return DogDetailsFragment() } } //۳ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_dog_details, container, false) } }
این کد DogDetailsFragment را به عنوان زیر کلاس Fragment اعلان می کند. به import android.support.v4.app.Fragment توجه کنید که از کتابخانه پشتیبانی v4 است که قبلا ذکر شد. هر Activity دارای یک FragmentManager است که فرگمنت آن را مدیریت می کند. همچنین یک رابط برای دسترسی، افزودن و حذف آن فرگمنت ها برای شما فراهم می کند. متوجه خواهید شد که در حالی که DogDetailsFragment یک متد نمونه factory دارد، newInstance، هیچ سازنده ای ندارد.
چون هیچ سازنده ای تعریف نکردید، کامپایلر به طور خودکار یک سازنده خالی و پیش فرض تولید می کند که آرگومان نمی گیرد. احتمالاً میدانید که اندروید ممکن است وقتی برنامه به پسزمینه میرود، یکActivity و تمام فرگمنت ها مرتبط با آن را از بین ببرد و بعداً دوباره ایجاد کند. هنگامی که اکتیویتی باز می گردد، FragmentManager آن با استفاده از سازنده پیش فرض خالی شروع به ایجاد مجدد فرگمنت ها می کند. به همین دلیل، بهترین روش این است که هرگز سازنده های غیر خالی را اعلان نکنید. در واقع، ساده ترین کار این است که هیچ کدام را مانند آنچه در آموزش انجام دادید، مشخص نکنید.
اضافه کردن فرگمنت در آموزش اندروید پیشرفته
خوب در این مرحله از آموزش اندروید پیشرفته میتوانیم با استفاده از سادهترین روش، یک Fragment را به Activity اضافه کنیم این نوع اضافه کردن، اضافه کردن استاتیک نامیده می شود. برای انجام این کار، activity_main.xml را باز کنید، تب Text را انتخاب کنید و موارد زیر را در داخل FrameLayout ریشه اضافه کنید:
<fragment android:id="@+id/details_fragment" class="com.raywenderlich.android.eldogo.DogDetailsFragment" android:layout_width="match_parent" android:layout_height="match_parent"/>
در این مرحله، یک تگ <fragment> را در activity layout قرار میدهید و نوع فرگمنت را که ویژگی کلاس باید ایجاد کند را مشخص میکنید. FragmentManager به شناسه نمای <fragment> نیاز دارد. با گنجاندن آن در XML، FragmentManager می داند که این فرگمنت را به طور خودکار به Activity اضافه کند.
اضافه کردن فرگمنت بصورت داینامیک
ابتدا activity_main.xml را دوباره باز کنید و <fragment> را که وارد کرده اید حذف کنید. DogListFragment.kt را باز کنید که همه کدهای لیست را دارد. می توانید ببینید که DogListFragment هیچ سازنده و ()newInstance ندارد. کد لیست در DogListFragment به برخی منابع بستگی دارد. شما باید اطمینان حاصل کنید که فرگمنت دارای یک مرجع معتبر به یک Context برای دسترسی به آن منابع است. اینجاست که ()onAttach وارد عمل می شود. در DogListFragment.kt و این کدها را اضافه کنید:
import android.os.Bundle import android.support.v7.widget.GridLayoutManager
GridLayoutManager به قرار دادن آیتم ها در لیست نژاد کمک می کند. در داخل DogListFragment.kt، متد زیر را بالای تعریف DogListAdapter اضافه کنید:
override fun onAttach(context: Context?) { super.onAttach(context) if (context != null) { // Get dog names and descriptions. val resources = context.resources names = resources.getStringArray(R.array.names) descriptions = resources.getStringArray(R.array.descriptions) urls = resources.getStringArray(R.array.urls) // Get dog images. val typedArray = resources.obtainTypedArray(R.array.images) val imageCount = names.size imageResIds = IntArray(imageCount) for (i in 0 until imageCount) { imageResIds[i] = typedArray.getResourceId(i, 0) } typedArray.recycle() } }
متد ()onAttach حاوی کدی است که به منابعی مانند نام نژاد و توضیحات مورد نیاز شما از طریق Context که فرگمنت به آن متصل است دسترسی دارد. از آنجایی که کد در ()onAttach است، می توانید مطمئن باشید که فرگمنت دارای یک Context معتبر است. این متد را درست بعد از ()onAttach قرار دهید:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view: View = inflater.inflate(R.layout.fragment_dog_list, container, false) val activity = activity as Context val recyclerView = view.findViewById<RecyclerView>(R.id.recycler_view) recyclerView.layoutManager = GridLayoutManager(activity, 2) recyclerView.adapter = DogListAdapter(activity) return view }
در ()onCreateView، سلسله مراتب نمای DogListFragment را که حاوی RecyclerView است و برخی از تنظیمات استاندارد RecyclerView را انجام می دهید. اگر قرار باشد view یک tv’lkj را بررسی کنید، ()onCreateView مکان خوبی برای شروع است زیرا view را ایجاد می کند. MainActivity.kt را باز کنید و موارد زیر را به انتهای ()onCreate اضافه کنید:
// ۱ if (savedInstanceState == null) { // ۲ supportFragmentManager // ۳ .beginTransaction() // ۴ .add(R.id.root_layout, DogListFragment.newInstance(), "dogList") // ۵ .commit() }
در این مرحله، برای وارد کردن DogListFragment به MainActivity از دوست جدید خود FragmentManager، می خواهید که این کار را انجام دهد. همانطور که در کدهای بالا مشاهده می کنید اعدادی برای توضیحات درج شده است که یک به یک توضیح داده می شوند.
- بررسی کنید که savedInstanceState مقدارش null باشد. این راهی است برای دیدن باز شدن اولیه صفحه.
- FragmentManager را با ارجاع به supportFragmentManager به جای fragmentManager بگیرید، زیرا از فرگمنت پشتیبانی استفاده می کنید.
- از FragmentManager بخواهید با فراخوانی ()beginTransaction تراکنش جدیدی را شروع کند.
- با فراخوانی add و passing عملیات افزودن مورد نظر خود را مشخص کنید
- در نهایت از FragmentManager بخواهید که تراکنش را با فراخوانی ()commit اجرا کند.
در کد بالا، یک بلوک if حاوی کدی است که فرگمنت را نمایش میدهد و بررسی میکند که Activity حالت ذخیرهشده نداشته باشد. هنگامی که یک اکتیویتی ذخیره می شود، تمام fragment ها فعال آن نیز ذخیره می شوند. اگر این بررسی را انجام ندهید، ممکن است این اتفاق بیفتد:
همیشه به خاطر داشته باشید که وضعیت ذخیره شده چگونه بر fragment های شما تأثیر می گذارد. موارد گفته شده در بالا را به پروژه اضافه کرده و اجرا کنید و پس از راه اندازی برنامه، لیست سگ ها را مشاهده خواهید کرد:
سخن پایانی آموزش اندروید پیشرفته
در این بخش از آموزش اندروید پیشرفته به تشریح فرگمنت Fragment در اندروید استادیو با کاتلین پرداخته شد. موارد مهمی برای کار کردن با فرگمنت ها در اندروید مطرح شد و یک پروژه نیمه آماده را برای درک بهتر کدها و روش اعمال آنها در پروژه، فراهم کردیم. موارد مطرح شده می تواند به عنوان اولین قدم در اجرای فرگمنت ها در اندروید برداشته شود و مطمئناً همه نکات در این آموزش گنجانده نشده است.
پیشنهاد می کنیم علاوه بر تمرین و تکرار کدنویسی در اندروید استادیو با مشخص کردن یک چارچوب توسعه، قدم محکمی برای تولید و توسعه اپلیکشن های مختلف بردارید و از آموزش های اصولی و پایه ای غافل نمانید. همانطور که در ابتدای آموزش نیز اشاره شد منابع مهم آموزشی را از سایت های معتبری مانند فرادرس برای هر قسمت از آموزش معرفی کردیم که امیدواریم مفید واقع شود. موفق و پیروز باشد.
یک پاسخ
مطالب گفته شده در این پست خیلی مفید بود ممنون