Fragment هو مكون واجهة مستخدم قابل لإعادة الاستخدام في Android يتم تضمينه في Activity وإدارته عبر FragmentManager. كل جزء له دورة حياة خاصة به، layout وحالة خاصة به. Fragment يبسط التكيف مع أحجام الشاشات المختلفة وإعادة استخدام الكود. اقرأ المزيد في دليل Google الرسمي.
أهم النقاط
Fragment هو مكون واجهة مستخدم معياري في Android يمثل جزءًا من الشاشة داخل Activity. يمكن لـ Fragment إدارة layout الخاص به، والتعامل مع أحداث دورة الحياة، وحفظ حالته. بفضل النمطية، يمكن استخدام نفس الجزء في Activities مختلفة وعلى أجهزة مختلفة.
ظهرت API Fragment في Android 3.0 (Honeycomb, API 11) في عام 2011 لدعم الأجهزة اللوحية. قبل ذلك، كان على المطورين إنشاء Activities منفصلة للهاتف والجهاز اللوحي. سمح Fragment بتجميع شاشة من كتل مستقلة. في عام 2019، أصدرت Google مكتبة Jetpack Fragment مع توافق مع الإصدارات السابقة حتى API 4.
وفقًا لـ Google (2026)، 80% من التطبيقات في Google Play تستخدم Fragment بشكل ما. تم تنزيل مكتبة Jetpack Fragment أكثر من 10 مليار مرة عبر Google Play Services. لا يزال Fragment مكونًا رئيسيًا في بنية Android حتى في عصر Jetpack Compose.
دورة حياة Fragment أكثر تعقيدًا من دورة حياة Activity لأنها تعتمد على حالة Activity المضيفة. يمر Fragment بنفس حالات Activity ولكنه يضيف استدعاءات خاصة به: onAttach، onCreateView، onViewCreated، onActivityCreated، onDestroyView، onDetach.
| استدعاء Fragment | ما يقابله في Activity | الغرض |
|---|---|---|
| onAttach | قبل onCreate | Fragment مرتبط بـ Activity |
| onCreate | onCreate | تهيئة بيانات غير مرتبطة بواجهة المستخدم |
| onCreateView | onCreate | إنشاء layout عبر inflater |
| onViewCreated | onCreate | ربط عناصر واجهة المستخدم بعد إنشاء العرض |
| onDestroyView | onDestroy | إزالة العرض، تحرير موارد واجهة المستخدم |
| onDetach | onDestroy | Fragment مفصول عن Activity |
الفرق الرئيسي في دورة حياة Fragment هو استدعاء onCreateView و onDestroyView بين onCreate و onDestroy. يمكن أن يوجد Fragment بدون واجهة مستخدم (إذا كان 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 مباشرة بعد ذلك، وهنا من الآمن العثور على العناصر بالمعرف. onDestroyView هي اللحظة الأخيرة لمسح مراجع العرض.
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 بعد تدمير العرض سيؤدي إلى NullPointerException. توصي Google بهذا النمط لجميع الأجزاء.
لـ نقل البيانات بين الأجزاء، تقدم Android عدة آليات. الأكثر موثوقية هو ViewModel مشترك بين أجزاء Activity واحدة. Fragment Result API مناسب للأحداث لمرة واحدة. وسائط Bundle مناسبة للبيانات عند إنشاء جزء.
// ViewModel مشترك لجزئين
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// الجزء A: يرسل حدثًا عبر Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))
// الجزء B: يستقبل الحدث
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (المضاف في Fragment 1.3.0) يستبدل setTargetFragment/onActivityResult القديمين. API آمن من حيث النوع، ويستخدم Bundle، ولا يتطلب معرفة بالمستقبل. يعمل Parent FragmentManager كوسيط بين الأجزاء.
الاختيار بين Fragment و Activity يعتمد على بنية التطبيق. Fragment إلزامي للتخطيطات المتكيفة (هاتف + جهاز لوحي)، ولرسوم متحركة انتقالية مخصصة، ولاستخدام Jetpack Navigation. Activity أفضل للتطبيقات البسيطة بشاشة أو شاشتين.
| المعيار | Fragment | Activity |
|---|---|---|
| سرعة الإنشاء | أسرع (مكون خفيف) | أبطأ (عملية نظام) |
| إعادة الاستخدام | عالية (جزء واحد في Activities مختلفة) | منخفضة (كل شاشة لها Activity خاصة بها) |
| رسوم الانتقال المتحركة | مرنة (FragmentTransaction) | محدودة (overridePendingTransition) |
| الحفظ عند التدوير | تلقائي (المدير يستعيد) | يدوي (onSaveInstanceState) |
| Deep Links | عبر Navigation Component | دعم أصلي عبر intent-filter |
النهج الحديث للعمل مع Fragment هو Jetpack Navigation Component، الذي يحل محل الإدارة اليدوية لـ FragmentManager. توفر المكتبة NavGraph (رسم بياني للتنقل XML)، و NavHostFragment، و Safe Args لنقل بيانات آمن من حيث النوع.
مكتبة 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 هو جزء من واجهة المستخدم داخل Activity، لا يمكن أن يوجد بشكل مستقل. ينجو Fragment من إعادة إنشاء Activity عند تدوير الشاشة. Activity هي شاشة كاملة بدورة حياة خاصة بها، ويعتمد Fragment على دورة حياة Activity.
Fragment — عندما تتكون الشاشة من عدة كتل مستقلة (تبويبات، رئيسي-تفصيلي، تكيف مع جهاز لوحي). Activity — عندما لا تحتوي الشاشة على كتل قابلة للتكرار. توصي Google بـ Single Activity + متعدد Fragment.
ثلاث طرق: عبر Activity الأم (مشاركة ViewModel)، عبر Fragment Result API (setFragmentResult)، عبر وسائط Bundle عند إنشاء Fragment. ViewModel هي الطريقة المفضلة حيث يتم حفظ البيانات أثناء إعادة الإنشاء.
Fragment Transaction هي عملية ذرية تغير مجموعة الأجزاء. FragmentManager.beginTransaction() يفتح معاملة يمكن فيها استدعاء add، remove، replace، hide، show. تنتهي كل معاملة بـ commit() أو commitNow().
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.