0Pricing
Android Academy · درس

الأجزاء

أنشئ واجهات مستخدم معيارية باستخدام 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 بـ Activity
  • onCreate — إنشاء 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. بنية المشروع وملف البيان
  2. الأنشطة ودورة الحياة
  3. التخطيطات وطرق العرض
  4. معالجة إدخال المستخدم
  5. النوايا والتنقّل
  6. الأجزاء
  7. الأذونات وطلبات وقت التشغيل
← العودة إلى Android Academy