Fragment — یک کامپوننت UI قابل استفاده مجدد در اندروید است که در Activity嵌入 میشود و از طریق FragmentManager مدیریت میگردد. هر قطعه چرخه حیات، layout و وضعیت مخصوص خود را دارد. Fragment تطبیق با اندازههای مختلف صفحه و استفاده مجدد از کد را آسان میکند.详细信息 را در راهنمای رسمی Google بخوانید.
نکات اصلی
Fragment — یک کامپوننت ماژولار رابط کاربری اندروید است که بخشی از صفحه را در داخل Activity نمایش میدهد. Fragment میتواند layout خود را مدیریت کند، رویدادهای چرخه حیات را پردازش کرده و وضعیت خود را ذخیره نماید. به دلیل ماژولار بودن، یک قطعه میتواند در Activityهای مختلف و دستگاههای گوناگون استفاده شود.
Fragment API در Android 3.0 (Honeycomb, API 11) سال 2011 برای پشتیبانی از تبلتها معرفی شد. قبل از آن، توسعهدهندگان مجبور بودند Activityهای جداگانهای برای تلفن و تبلت ایجاد کنند. Fragment امکان ساخت صفحه از بلوکهای مستقل را فراهم کرد. در سال 2019، Google کتابخانه Jetpack Fragment را با سازگاری معکوس تا API 4 منتشر کرد.
طبق دادههای Google (2026)، 80% برنامههای Google Play از Fragment به شکلی استفاده میکنند. کتابخانه Jetpack Fragment بیش از 10 میلیارد بار از طریق Google Play Services بارگیری شده است. Fragment حتی در عصر Jetpack Compose نیز یک کامپوننت کلیدی معماری اندروید باقی میماند.
چرخه حیات Fragment پیچیدهتر از Activity است، زیرا به وضعیت Activity میزبان بستگی دارد. Fragment همان مراحل Activity را طی میکند، اما کالبکهای مخصوص خود را اضافه میکند: onAttach، onCreateView، onViewCreated، onActivityCreated، onDestroyView، onDetach.
| کالبک Fragment | معادل Activity | هدف |
|---|---|---|
| onAttach | قبل از onCreate | Fragment به Activity متصل شد |
| onCreate | onCreate | مقداردهی دادههای غیرمرتبط با UI |
| onCreateView | onCreate | ایجاد layout از طریق inflater |
| onViewCreated | onCreate | اتصال عناصر UI پس از ایجاد view |
| onDestroyView | onDestroy | حذف view، آزادسازی منابع UI |
| onDetach | onDestroy | Fragment از Activity جدا شد |
تفاوت اصلی چرخه حیات Fragment — فراخوانی onCreateView و onDestroyView بین onCreate و onDestroy است. Fragment میتواند بدون UI وجود داشته باشد (اگر onCreateView null برگرداند). پس از بازسازی Activity، FragmentManager قطعات را به طور خودکار بازیابی میکند.
FragmentManager — کلاس مرکزی برای مدیریت قطعات در Activity است. این کلاس مسئول افزودن، حذف، جایگزینی قطعات، مدیریت پشته بازگشت و بازیابی وضعیت میباشد. FragmentManager از طریق supportFragmentManager (AndroidX) یا fragmentManager (API قدیمی) قابل دسترسی است.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// اگر قطعه هنوز اضافه نشده است — ایجاد میکنیم
if (savedInstanceState == null) {
val transaction = this.supportFragmentManager
.beginTransaction()
transaction.add(R.id.fragment_container, ListFragment())
transaction.addToBackStack(null)
transaction.commit()
}
}
fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit()
}
}تراکنشهای FragmentTransaction — اتمی هستند. commit() اجرا را به چرخه بعدی Looper برنامهریزی میکند. برای اجرای فوری از commitNow() استفاده کنید. addToBackStack(null) تراکنش را به پشته بازگشت اضافه میکند — دکمه «بازگشت» عملیات را لغو خواهد کرد.
بیایید متدهای کلیدی چرخه حیات Fragment را با مثال Kotlin بررسی کنیم. onCreateView layout را ایجاد میکند — برخلاف Activity، متد باید View برگرداند. onViewCreated بلافاصله پس از آن فراخوانی میشود، در اینجا یافتن عناصر با id ایمن است. onDestroyView — آخرین فرصت برای پاکسازی ارجاعات view.
class DetailFragment : Fragment() {
private var _binding: FragmentDetailBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDetailBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textTitle.setText("جزئیات")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}الگوی View Binding با _binding/binding تضمین میکند که پس از onDestroyView ارجاع به layout صفر میشود. دسترسی به binding پس از نابودی view باعث NullPointerException میشود. این الگو توسط Google برای تمام قطعات توصیه شده است.
برای انتقال داده بین قطعات، Android چندین مکانیسم ارائه میدهد. قابل اعتمادترین — ViewModel مشترک، که بین قطعات یک Activity به اشتراک گذاشته میشود. Fragment Result API برای رویدادهای یکبار مصرف مناسب است. آرگومانهای Bundle — برای دادهها هنگام ایجاد Fragment.
// ViewModel مشترک برای دو قطعه
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// Fragment A: رویداد را از طریق Fragment Result API ارسال میکند
setFragmentResult("request_key", bundleOf("key" to "value"))
// Fragment B: رویداد را دریافت میکند
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (اضافه شده در Fragment 1.3.0) جایگزین setTargetFragment/onActivityResult منسوخ شده است. API type-safe است، از Bundle استفاده میکند و نیازی به شناخت دریافتکننده ندارد. Parent FragmentManager به عنوان واسطه بین قطعات عمل میکند.
انتخاب بین Fragment و Activity به معماری برنامه بستگی دارد. Fragment برای layoutهای تطبیقی (تلفن + تبلت)، انیمیشنهای سفارشی انتقال و استفاده از Jetpack Navigation ضروری است. Activity برای برنامههای ساده با یک یا دو صفحه ترجیح داده میشود.
| معیار | Fragment | Activity |
|---|---|---|
| سرعت ایجاد | سریعتر (کامپوننت سبک) | کندتر (فرآیند سیستمی) |
| استفاده مجدد | بالا (یک قطعه در Activityهای مختلف) | پایین (هر صفحه Activity خود را دارد) |
| انیمیشن انتقال | انعطافپذیر (FragmentTransaction) | محدود (overridePendingTransition) |
| ذخیره در چرخش | خودکار (مدیر بازیابی میکند) | دستی (onSaveInstanceState) |
| Deep Links | از طریق Navigation Component | پشتیبانی بومی از طریق intent-filter |
رویکرد مدرن کار با Fragment — Jetpack Navigation Component است که جایگزین مدیریت دستی FragmentManager میشود. این کتابخانه NavGraph (گراف ناوبری XML)، NavHostFragment و Safe Args برای انتقال type-safe دادهها فراهم میکند.
کتابخانه Jetpack Fragment (androidx.fragment:fragment-ktx) شامل FragmentResult API، DialogFragment، BottomSheetDialogFragment و یکپارچهسازی با کامپوننتهای Lifecycle-aware است. از سال 2026، Google توصیه میکند از Fragment فقط از طریق Jetpack Navigation استفاده کنید، نه مستقیماً.
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@+id/listFragment">
<fragment
android:id="@+id/listFragment"
android:name=".ListFragment"
android:label="فهرست">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="جزئیات" />
</navigation>سوالات متداول
FragmentManager — کلاسی است که تراکنشهای قطعات را مدیریت میکند. این کلاس قطعات را در کانتینر Activity اضافه، حذف و جایگزین میکند. FragmentManager وضعیت قطعات را هنگام بازسازی Activity بازیابی کرده و پشته بازگشت را مدیریت میکند.
Fragment — بخشی از UI داخل Activity است، نمیتواند به طور مستقل وجود داشته باشد. Fragment از بازسازی Activity هنگام چرخش صفحه جان سالم به در میبرد. Activity — یک صفحه کامل با Lifecycle مخصوص خود است، Fragment به Lifecycle Activity وابسته است.
Fragment — وقتی صفحه از چندین بلوک مستقل تشکیل شده است (تبها، master-detail، تطبیق با تبلت). Activity — وقتی صفحه بلوکهای تکراری ندارد. Google توصیه میکند Single Activity + چندین Fragment.
سه روش: از طریق Activity والد (ViewModel مشترک)، از طریق Fragment Result API (setFragmentResult)، از طریق آرگومانهای Bundle هنگام ایجاد Fragment. ViewMethod — روش ترجیحی، زیرا دادهها در بازسازی حفظ میشوند.
Fragment Transaction — عملیات اتمی تغییر مجموعه قطعات. FragmentManager.beginTransaction() یک تراکنش باز میکند که در آن میتوان add، remove، replace، hide، show را فراخوانی کرد. هر تراکنش با commit() یا commitNow() پایان مییابد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید