الأجزاء
أنشئ واجهات مستخدم معيارية باستخدام Fragments. تعلّم دورة حياة الجزء، واستخدام ViewBinding في الأجزاء، وتمرير الوسائط، وإدارة مكدس الرجوع، والتواصل بين الجزء والنشاط.
الأجزاء درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 6 من أصل 7. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 7 دروس في المجموع.
ما هي Fragments؟
إن Fragment وحدة قابلة لإعادة الاستخدام من واجهة المستخدم، وتوجد داخل Activity. فكّر فيها كأنها Activity فرعية لها تخطيط ودورة حياة ومنطق خاص بها.
لماذا نستخدم Fragments؟
- إعادة استخدام واجهة المستخدم عبر Activities متعددة
- التعامل مع تخطيطات مختلفة للهاتف والجهاز اللوحي
- إنشاء تدفقات متعددة الشاشات من دون استخدام Activities متعددة
- العمل بشكل طبيعي مع Navigation Component
دورة حياة Fragment
لدى Fragments دورة حياة خاصة بها تعمل بالتزامن مع دورة حياة Activity. ومن أهم callbacks:
onAttach— إرفاق Fragment بـ ActivityonCreate— إنشاء Fragment (من دون View بعد)onCreateView— تضخيم التخطيطonViewCreated— أصبحت View جاهزة، أعدّ واجهة المستخدم هناonDestroyView— تدمير View (أزل مراجع View)onDetach— فصل Fragment
إنشاء Fragment
أنشئ فئة ترث من Fragment وتجاوز onCreateView لتضخيم التخطيط:
import androidx.fragment.app.Fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class HomeFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
}ViewBinding في Fragments
استخدم ViewBinding في Fragments، لكن حرّر binding في onDestroyView لتجنب تسرّبات الذاكرة:
class HomeFragment : Fragment() {
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tvTitle.text = "Welcome!"
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null // prevent memory leak
}
}XML لتخطيط Fragment
أنشئ res/layout/fragment_home.xml كما تفعل مع تخطيط Activity. تصبح View الجذر هي View الخاصة بـ Fragment:
<!-- res/layout/fragment_home.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="Home" />
</LinearLayout>إضافة Fragment إلى Activity
طريقتان لإضافة Fragment إلى Activity:
- ثابتة (XML) — التصريح عنها في التخطيط باستخدام وسم
<fragment>. وتكون ثابتة أثناء التشغيل. - ديناميكية (الكود) — استخدام
FragmentManagerوالمعاملات. ويمكن تبديلها أثناء التشغيل.
<!-- Static: in activity_main.xml -->
<fragment
android:id="@+id/homeFragment"
android:name="com.example.HomeFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />معاملات Fragment الديناميكية
استخدم supportFragmentManager لإضافة Fragments أو استبدالها أو إزالتها أثناء التشغيل:
// In Activity:
class MainActivity : AppCompatActivity(R.layout.activity_main) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.add(R.id.fragmentContainer, HomeFragment())
.commit()
}
}
fun showDetail(id: Int) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, DetailFragment.newInstance(id))
.addToBackStack(null) // allow back navigation
.commit()
}
}تمرير الوسائط إلى Fragments
مرّر البيانات عبر Bundle باستخدام نمط المصنع في companion object. لا تستخدم مطلقًا مُنشئ Fragment مع معاملات — إذ يعيد Android إنشاء Fragments باستخدام مُنشئ بلا معاملات بعد تغييرات الإعداد:
class DetailFragment : Fragment() {
companion object {
private const val ARG_ID = "item_id"
fun newInstance(itemId: Int): DetailFragment {
return DetailFragment().apply {
arguments = Bundle().apply {
putInt(ARG_ID, itemId)
}
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val itemId = requireArguments().getInt(ARG_ID)
// use itemId to load data
}
}التواصل بين Fragment وActivity
استخدم interface معرّفًا في Fragment وتنفذه Activity. ويحصل Fragment على مرجع عبر onAttach:
class ListFragment : Fragment() {
interface OnItemSelected {
fun onItemSelected(id: Int)
}
private var listener: OnItemSelected? = null
override fun onAttach(context: Context) {
super.onAttach(context)
listener = context as? OnItemSelected
}
private fun handleClick(id: Int) {
listener?.onItemSelected(id)
}
override fun onDetach() {
super.onDetach()
listener = null
}
}مكدس الرجوع
عندما تستدعي addToBackStack(null) في معاملة، يؤدي الضغط على زر الرجوع إلى إزالة Fragment من المكدس:
- من دون
addToBackStack— يخرج زر الرجوع من Activity - مع
addToBackStack— يعيد زر الرجوع المستخدم إلى Fragment السابقة - استخدم
popBackStack()برمجيًا للتنقل إلى الخلف
Fragment داخل حاوية
يحتاج تخطيط Activity إلى View حاوية فقط — وعادةً ما تكون FrameLayout لها معرّف. ويملأ Fragment تلك الحاوية:
<!-- activity_main.xml -->
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />اختبار سريع
لماذا ينبغي ألا تمرر مطلقًا معاملات إلى مُنشئ Fragment، وأن تستخدم بدلًا من ذلك Bundle عبر مصنع companion؟
مراجعة: Fragments
تُعد Fragments لبنات بناء واجهات مستخدم Android الحديثة:
- ارث من
Fragmentوضخّم التخطيط فيonCreateView - أعدّ واجهة المستخدم في
onViewCreated - حرّر ViewBinding في
onDestroyView - مرّر البيانات عبر
Bundle+ مصنع companion (newInstance) - استخدم
addToBackStackللتنقل إلى الخلف - تواصل مع Activity عبر interface
التالي: طلب الأذونات الخطرة أثناء التشغيل.
الأسئلة الشائعة
هل درس «الأجزاء» مجاني؟
نعم — نص درس «الأجزاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 7 دروس في المجموع.
ماذا ستتعلم في «الأجزاء»؟
أنشئ واجهات مستخدم معيارية باستخدام Fragments. تعلّم دورة حياة الجزء، واستخدام ViewBinding في الأجزاء، وتمرير الوسائط، وإدارة مكدس الرجوع، والتواصل بين الجزء والنشاط. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 6 من أصل 7.
كم من الوقت يستغرق درس «الأجزاء»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بنية المشروع وملف البيان
- الأنشطة ودورة الحياة
- التخطيطات وطرق العرض
- معالجة إدخال المستخدم
- النوايا والتنقّل
- الأجزاء
- الأذونات وطلبات وقت التشغيل