استفاده از Fragment ها در اندروید

اگرچه که fragment ها حدود سه سال هستند که جزئی از Android API هستند ولی من هنوز توسعه دهندگانی را می‌بینم که در تلاش برای درک ارزش و هدف استفاده از fragmentها هستند.

یک توضیح رایج درمورد استفاده از fragmentها که خودم هم معمولا از ان استفاده میکنم:

Fragmentها رابط کاربری و منطق پشت آن را دسته بندی یا گروه بندی می‌کند ( منظور منظم کردن هر بخش به صورت جداست).

با اینکه این توضیح دقیقی است ولی در جواب کسی که می‌گوید بدون استفاده از آنها نیز اپلیکیشن من کار می‌کند، می‌گویم استفاده از آنها مانند ساختن یک ساعت دقیق سویسی است درحالی که شما فقط می‌خواهید بدانید ساعت چند است!

دراینجا دلایلی برای مفید بودن استفاده از fragmentها رو برایتان می گویم:

سر و کار داشتن با دستگاه‌هایی با ابعاد ظاهری متفاوت

کلاس Activity اغلب به عنون کلاس اصلی رابط کاربری در اندروید شناخته می‌شود. درست است که انجام رندر UI برنامه بر عهده این کلاس است اما بسیاری از مسئولیت های دیگر را مانند lifecycle management و platform interaction و … را برعهده دارد.

قرار دادن تمام این بارها بر دوش کلاس Activity باعث بوجود آمدن مشکلاتی در برخورد با دستگاه‌های مختلف ( از نظر ابعاد ) می‌شود. درنهایت یکی از دو مورد زیر رخ خواهد داد :

  • یک Activity که شامل کدهای زیاد برای هندل کردن موارد خاص برای دستگاه‌هایی با ابعاد متفاوت است.
  • چندین Activity که هر کدام برای یک سایز خاص بوجود آمده با UI های تکراری یا مشترک برای تمام Activity‌ها.

Fragmentها با در نظر گرفتن جرئیات رابط کاربری این مشکل را حل می‌کنند و این بار را از روی دوش Activity برمی‌دارند. به این ترتیب که fragmentهای جداگانه‌ای برای هر ابعاد مختلف ساخته میشود که جزئیات مربوطه در رابط کاربری در هر سایز رو مشخص میکنند و Activity از زیر بار این مسئولیت آزاد شده و رابط کاربری برای سایز فعلی دستگاه رو به fragment واگذار می‌کند.

پاس دادن داده بین فرم‌های اپلیکیشن

همان طور که می‌دونید هر فرم از اپلیکیشن متعلق به یک Activity است. این باعث بوجود آمدن چالش‌هایی در انتقال و پاس دادن داده‌ها بین فرم‌ها می‌شود، زیرا Android Intent mechanism اجازه پاس دادن نوع داده‌ای مرجع ( object ) را بطور مستقیم بین Activityها نمی‌دهد. در عوض شی باید سریالایز (serialize) شده باشد یا بهش دسترسی عمومی داشته باشیم.

با ایجاد هر فرم به صورت یک fragment جداگانه از این سردرد پاس دادن داده‌ها و شی‌ها بطور کلی خلاص می‌یابیم. fragment ها همیشه در داخل یه Activity مشخص وجو دارند و Activity به آنها و محتوایات آنها دسترسی دارد. با ذخیره اطلاعات مورد نظر در هر Activity هر fragment که برای هر فرم ایجاد شده به تمام داده‌های آن Activity به راحتی دسترسی دارد یعنی دیگر نیاز به پاس دادن داده‌ها و شی‌ها به یک Activity دیگر ندارید.

ساختار بخشیدن به رابط کاربری

دو تا از رایج ترین ابزار برای ساختار بخشیدن به فرم‌ها استفاده از تب و لیست کشویی می باشد. تب‌های هنگامی که تعداد کمی فرم داشته باشیم و لیست‌های کشویی که فرم‌ها زیاد و مختلف هستند پر کاربرد و عالی هستند، که بعنوان مثال در شکل زیر استفاده از لیست کشویی در برنامه ایمیل نشاد داده شده است.

EmailInboxWithMenu

fragmentها استفاده از این ابزار را بسیار آسان کرده است. در هر دو شما به راحتی با قرار دادن یک ActionBar به حالت ناوبری (navigation) مناسب ، رابط کاربری مناسب و سپس استفاده از FragmentTransaction برای سوئیچ کردن بین fragmentهایی که در حال حاضر نمایش داده می‌شود ، استفاده کنید.

  • برای تب‌ها از NAVIGATION_MODE_TABS و ActionBar.TabListener استفاده کنید
  • و برای لیست‌ها کشویی از NAVIGATION_MODE_LIST و ActionBar.OnNavigationListener استفاده کنید.

برخی ویژگی‌های fragment ها بطور خلاصه

  • هر fragment دارای لایوت ، رفتار ( behavior code ) و چرخه عمر (lifecycle callbacks ) خودش است.
  • شما می‌توانید یک fragment را در یک Activity حذف یا اضافه کنید در حالی که Activity در حال اجرا است.
  • شما می‌توانید از چند fragment برای ساختن یک Activity استفاده کنید تا یک رابط کاربری چند تکه با functionality بالا داشته باشید.
  • یک fragment می‌تواند در چند Activity استفاده شود.
  • چرخه عمر هر fragment وابسه به Activity میزبان است.
  • هنگامی که یک Activity متوقف می‌شود تمام fragment های قابل دسترس در آن Activity نیز متوقف می‌شوند.
  • رفتار fragment می‌تواند به هیچ یک از اجزا رابط کاربری وابسته نباشد.
  • fragment ها از API 11 به بعد قابل دسترس هستند.

برای جزئیات بیشتر میتوانید به سایت رسمی مراجعه کنید.

دیدگاه خود را منتشر کنید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *