Fragment: چیست، قطعات و FragmentManager در اندروید

نویسنده: IT Sectr منتشر شده: 2026-02-22 زمان مطالعه: 7 دقیقه

Fragment — یک کامپوننت UI قابل استفاده مجدد در اندروید است که در Activity嵌入 می‌شود و از طریق FragmentManager مدیریت می‌گردد. هر قطعه چرخه حیات، layout و وضعیت مخصوص خود را دارد. Fragment تطبیق با اندازه‌های مختلف صفحه و استفاده مجدد از کد را آسان می‌کند.详细信息 را در راهنمای رسمی Google بخوانید.

نکات اصلی

  • Fragment — کامپوننت UI داخل Activity با چرخه حیات و layout مخصوص خود
  • FragmentManager — کلاس مدیریت تراکنش‌های قطعات و پشته بازگشت
  • FragmentTransaction — عملیات اتمی افزودن، جایگزینی یا حذف قطعات
  • Jetpack Fragment — کتابخانه سازگاری معکوس تا Android 1.6 (API 4)
  • ViewModel — کامپوننت مشترک برای تبادل داده بین قطعات در یک Activity

Fragment چیست؟

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

چرخه حیات Fragment پیچیده‌تر از Activity است، زیرا به وضعیت Activity میزبان بستگی دارد. Fragment همان مراحل Activity را طی می‌کند، اما کال‌بک‌های مخصوص خود را اضافه می‌کند: onAttach، onCreateView، onViewCreated، onActivityCreated، onDestroyView، onDetach.

کال‌بک Fragmentمعادل Activityهدف
onAttachقبل از onCreateFragment به Activity متصل شد
onCreateonCreateمقداردهی داده‌های غیرمرتبط با UI
onCreateViewonCreateایجاد layout از طریق inflater
onViewCreatedonCreateاتصال عناصر UI پس از ایجاد view
onDestroyViewonDestroyحذف view، آزادسازی منابع UI
onDetachonDestroyFragment از Activity جدا شد

مقایسه چرخه حیات Fragment و Activity

تفاوت اصلی چرخه حیات Fragment — فراخوانی onCreateView و onDestroyView بین onCreate و onDestroy است. Fragment می‌تواند بدون UI وجود داشته باشد (اگر onCreateView null برگرداند). پس از بازسازی Activity، FragmentManager قطعات را به طور خودکار بازیابی می‌کند.

FragmentManager و تراکنش‌ها

FragmentManager — کلاس مرکزی برای مدیریت قطعات در Activity است. این کلاس مسئول افزودن، حذف، جایگزینی قطعات، مدیریت پشته بازگشت و بازیابی وضعیت می‌باشد. FragmentManager از طریق supportFragmentManager (AndroidX) یا fragmentManager (API قدیمی) قابل دسترسی است.

kotlin
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

بیایید متدهای کلیدی چرخه حیات Fragment را با مثال Kotlin بررسی کنیم. onCreateView layout را ایجاد می‌کند — برخلاف Activity، متد باید View برگرداند. onViewCreated بلافاصله پس از آن فراخوانی می‌شود، در اینجا یافتن عناصر با id ایمن است. onDestroyView — آخرین فرصت برای پاکسازی ارجاعات view.

kotlin
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.

kotlin
// 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 و Activity به معماری برنامه بستگی دارد. Fragment برای layoutهای تطبیقی (تلفن + تبلت)، انیمیشن‌های سفارشی انتقال و استفاده از Jetpack Navigation ضروری است. Activity برای برنامه‌های ساده با یک یا دو صفحه ترجیح داده می‌شود.

معیارFragmentActivity
سرعت ایجادسریع‌تر (کامپوننت سبک)کندتر (فرآیند سیستمی)
استفاده مجددبالا (یک قطعه در Activityهای مختلف)پایین (هر صفحه Activity خود را دارد)
انیمیشن انتقالانعطاف‌پذیر (FragmentTransaction)محدود (overridePendingTransition)
ذخیره در چرخشخودکار (مدیر بازیابی می‌کند)دستی (onSaveInstanceState)
Deep Linksاز طریق Navigation Componentپشتیبانی بومی از طریق intent-filter

Jetpack Fragment و Jetpack Navigation

رویکرد مدرن کار با 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 استفاده کنید، نه مستقیماً.

xml

<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 — چیست؟

FragmentManager — کلاسی است که تراکنش‌های قطعات را مدیریت می‌کند. این کلاس قطعات را در کانتینر Activity اضافه، حذف و جایگزین می‌کند. FragmentManager وضعیت قطعات را هنگام بازسازی Activity بازیابی کرده و پشته بازگشت را مدیریت می‌کند.

Fragment چه تفاوتی با Activity دارد؟

Fragment — بخشی از UI داخل Activity است، نمی‌تواند به طور مستقل وجود داشته باشد. Fragment از بازسازی Activity هنگام چرخش صفحه جان سالم به در می‌برد. Activity — یک صفحه کامل با Lifecycle مخصوص خود است، Fragment به Lifecycle Activity وابسته است.

چه زمانی از Fragment به جای Activity استفاده کنیم؟

Fragment — وقتی صفحه از چندین بلوک مستقل تشکیل شده است (تب‌ها، master-detail، تطبیق با تبلت). Activity — وقتی صفحه بلوک‌های تکراری ندارد. Google توصیه می‌کند Single Activity + چندین Fragment.

چگونه داده بین Fragmentها منتقل کنیم؟

سه روش: از طریق Activity والد (ViewModel مشترک)، از طریق Fragment Result API (setFragmentResult)، از طریق آرگومان‌های Bundle هنگام ایجاد Fragment. ViewMethod — روش ترجیحی، زیرا داده‌ها در بازسازی حفظ می‌شوند.

Fragment Transaction چیست؟

Fragment Transaction — عملیات اتمی تغییر مجموعه قطعات. FragmentManager.beginTransaction() یک تراکنش باز می‌کند که در آن می‌توان add، remove، replace، hide، show را فراخوانی کرد. هر تراکنش با commit() یا commitNow() پایان می‌یابد.

خلاصه

  • Fragment — کامپوننت UI قابل استفاده مجدد داخل Activity با چرخه حیات، layout و وضعیت مخصوص خود
  • FragmentManager تراکنش‌های قطعات را مدیریت کرده و وضعیت آنها را هنگام بازسازی Activity بازیابی می‌کند
  • FragmentTransaction — عملیات اتمی برای افزودن، جایگزینی، حذف و مخفی‌سازی قطعات
  • چرخه حیات Fragment شامل شش کال‌بک، از onAttach تا onDetach، با نقطه اضافی onCreateView
  • ViewModel — روش توصیه‌شده برای تبادل داده بین قطعات در یک Activity
  • Fragment Result API انتقال type-safe رویدادهای یکبار مصرف بین قطعات را فراهم می‌کند

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید