مكوّن 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في تخطيط ActivityfindNavController().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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ViewModel وLiveData
- قاعدة بيانات Room
- Coroutines والدوال المعلّقة
- نمط Repository
- مكوّن Navigation
- حقن التبعيات باستخدام Hilt