0Pricing
Android Academy · درس

مكوّن Navigation

أديروا التنقّل بين شاشات متعددة باستخدام NavGraph مرئي وSafe Args للوسائط الآمنة نوعيًا وNavController ودعم deep links.

مكوّن Navigation درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 5 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.

ما هو Navigation Component؟

إن Navigation Component مكتبة من Android Jetpack تدير التنقل بين fragments، ومكدس الرجوع، والروابط العميقة، ورسوم الانتقال المتحركة ضمن مخطط مرئي واحد.

الفوائد الأساسية:

  • مخطط تنقل مرئي في Android Studio
  • تمرير معاملات آمن من حيث النوع (Safe Args)
  • إدارة تلقائية لمكدس الرجوع
  • دعم الروابط العميقة مباشرةً

الإعداد: الاعتماديات

أضف إلى app/build.gradle:

// app/build.gradle
dependencies {
    implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
    implementation 'androidx.navigation:navigation-ui-ktx:2.7.7'
}

// project/build.gradle (for Safe Args):
buildscript {
    dependencies {
        classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7'
    }
}

// app/build.gradle — apply the plugin:
plugins {
    id 'androidx.navigation.safeargs.kotlin'
}

مخطط التنقل (nav_graph.xml)

أنشئ res/navigation/nav_graph.xml. فهو يعرّف الوجهات (fragments) والإجراءات (مسارات التنقل):

<!-- res/navigation/nav_graph.xml -->
<navigation
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.HomeFragment">
        <action
            android:id="@+id/action_home_to_detail"
            app:destination="@id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.DetailFragment">
        <argument
            android:name="itemId"
            app:argType="integer" />
    </fragment>
</navigation>

NavHostFragment في تخطيط Activity

استبدل حاوية FrameLayout بـ NavHostFragment. فهو يعمل كمضيف لجميع وجهات التنقل:

<!-- activity_main.xml -->
<androidx.fragment.app.FragmentContainerView
    android:id="@+id/navHostFragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:navGraph="@navigation/nav_graph"
    app:defaultNavHost="true" />

NavController — التنقل بين Fragments

احصل على NavController واستدعِ navigate() باستخدام معرّف إجراء:

class HomeFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.btnOpenDetail.setOnClickListener {
            // Navigate using action ID from nav_graph
            findNavController().navigate(R.id.action_home_to_detail)
        }
    }
}

Safe Args — معاملات آمنة من حيث النوع

ينشئ Safe Args فئات لتمرير المعاملات بين fragments من دون تحويل الأنواع أو أخطاء في المفاتيح:

// In HomeFragment — pass itemId:
binding.btnOpenDetail.setOnClickListener {
    val action = HomeFragmentDirections.actionHomeToDetail(itemId = 42)
    findNavController().navigate(action)
}

// In DetailFragment — receive itemId:
class DetailFragment : Fragment() {
    private val args: DetailFragmentArgs by navArgs()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val id = args.itemId   // Int, type-safe
        viewModel.loadItem(id)
    }
}

التنقل إلى الأعلى

اربط زر الرجوع إلى الأعلى في Toolbar بـ NavController لتفعيل التنقل التلقائي إلى الخلف:

class MainActivity : AppCompatActivity() {

    private lateinit var navController: NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navHostFragment = supportFragmentManager
            .findFragmentById(R.id.navHostFragment) as NavHostFragment
        navController = navHostFragment.navController

        // Wire toolbar Up button
        setupActionBarWithNavController(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp() || super.onSupportNavigateUp()
    }
}

التنقل السفلي باستخدام NavController

اربط BottomNavigationView بـ NavController، إذ يتولى تلقائيًا تحديد علامات التبويب وإدارة مكدس الرجوع:

// In Activity.onCreate():
val navHostFragment = supportFragmentManager
    .findFragmentById(R.id.navHostFragment) as NavHostFragment
val navController = navHostFragment.navController

// Wire BottomNavigationView
binding.bottomNav.setupWithNavController(navController)

// Each menu item ID must match a fragment destination ID in nav_graph.xml

إزالة عناصر من مكدس الرجوع

تنقّل إلى الخلف برمجيًا أو إلى وجهة محددة:

// Go back one step
findNavController().popBackStack()

// Navigate back to a specific destination (popping everything on top)
findNavController().popBackStack(R.id.homeFragment, inclusive = false)

// Navigate and clear back stack (e.g., after login)
findNavController().navigate(
    R.id.action_login_to_home,
    null,
    NavOptions.Builder()
        .setPopUpTo(R.id.loginFragment, inclusive = true)
        .build()
)

الروابط العميقة

أضف رابطًا عميقًا إلى وجهة حتى يمكن فتح تطبيقك من عنوان URL:

<!-- In nav_graph.xml, inside the destination fragment: -->
<deepLink
    android:id="@+id/deepLinkDetail"
    app:uri="https://example.com/items/{itemId}" />

<!-- Also add intent-filter in AndroidManifest.xml for the Activity: -->
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="example.com" />
</intent-filter>

الانتقالات بين Fragments

أضف رسومًا متحركة مخصصة إلى إجراءات التنقل في مخطط التنقل:

<action
    android:id="@+id/action_home_to_detail"
    app:destination="@id/detailFragment"
    app:enterAnim="@anim/slide_in_right"
    app:exitAnim="@anim/slide_out_left"
    app:popEnterAnim="@anim/slide_in_left"
    app:popExitAnim="@anim/slide_out_right" />

تحقّق سريع

ما الذي يجب أن يتطابق بين معرّف عنصر القائمة في BottomNavigationView ومخطط التنقل لكي تتم معالجة علامات التبويب تلقائيًا؟

مراجعة: Navigation Component

يبسّط Navigation Component التطبيقات متعددة الشاشات:

  • nav_graph.xml مرئي — الوجهات + الإجراءات
  • NavHostFragment في تخطيط Activity
  • findNavController().navigate(actionId) للتنقل بين الشاشات
  • Safe Args — تمرير معاملات آمن من حيث النوع (من دون تحويل أنواع أو أخطاء مطبعية)
  • setupActionBarWithNavController() — زر رجوع إلى الأعلى تلقائيًا
  • setupWithNavController() — إعداد BottomNavigationView تلقائيًا

التالي: إضافة حقن الاعتماديات باستخدام Hilt لبنية نظيفة.

الأسئلة الشائعة

هل درس «مكوّن Navigation» مجاني؟

نعم — نص درس «مكوّن Navigation» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.

ماذا ستتعلم في «مكوّن Navigation»؟

أديروا التنقّل بين شاشات متعددة باستخدام NavGraph مرئي وSafe Args للوسائط الآمنة نوعيًا وNavController ودعم deep links. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 5 من أصل 6.

كم من الوقت يستغرق درس «مكوّن Navigation»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. ViewModel وLiveData
  2. قاعدة بيانات Room
  3. Coroutines والدوال المعلّقة
  4. نمط Repository
  5. مكوّن Navigation
  6. حقن التبعيات باستخدام Hilt
← العودة إلى Android Academy