0Pricing
Android Academy · درس

التنقّل السفلي

أنشئ تنقّلًا سفليًا بعلامات تبويب

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

أشرطة التنقّل السفلية

تضع العديد من التطبيقات أقسامها الرئيسية في شريط تنقّل سفلي. ويوفّر Compose العنصرين NavigationBar وNavigationBarItem لهذا الغرض.

NavigationBar

يُعد NavigationBar الحاوية التي توضع عادةً في خانة bottomBar ضمن Scaffold. وتحتوي على عدة عناصر من نوع NavigationBarItem.

NavigationBar {
    // items go here
}

NavigationBarItem

كل علامة تبويب هي عنصر NavigationBarItem يحتوي على icon، وlabel اختياري، وعلامة selected، وonClick.

NavigationBarItem(
    selected = true,
    onClick = { },
    icon = { Icon(Icons.Default.Home, contentDescription = "Home") },
    label = { Text("Home") }
)

نمذجة علامات التبويب

عرّفوا علامات التبويب كبيانات حتى تتمكنوا من التكرار عليها. وتفي فئة بيانات بسيطة تحتوي على مسار وتسمية وأيقونة بالغرض.

data class Tab(val route: String, val label: String, val icon: ImageVector)

val tabs = listOf(
    Tab("home", "Home", Icons.Default.Home),
    Tab("profile", "Profile", Icons.Default.Person)
)

تتبّع المسار الحالي

لتمييز علامة التبويب النشطة، تحتاجون إلى معرفة المسار الحالي. اقرأوه من إدخال مكدس الرجوع الحالي لوحدة التحكّم.

val backStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = backStackEntry?.destination?.route

تحديد العنصر المحدد

قارنوا مسار كل علامة تبويب مع currentRoute لتعيين علامة selected، وبذلك يميّز الشريط العنصر الصحيح.

NavigationBarItem(
    selected = currentRoute == tab.route,
    onClick = { navController.navigate(tab.route) },
    icon = { Icon(tab.icon, contentDescription = tab.label) },
    label = { Text(tab.label) }
)

تجنّب تراكم مكدس الرجوع

يجب ألا تؤدي نقرات علامات التبويب المتكررة إلى تراكم الوجهات. استخدموا popUpTo مع وجهة البدء، بالإضافة إلى launchSingleTop عند التنقّل بين علامات التبويب.

navController.navigate(tab.route) {
    popUpTo(navController.graph.startDestinationId) { saveState = true }
    launchSingleTop = true
    restoreState = true
}

saveState / restoreState

يحافظ كل من saveState وrestoreState على موضع التمرير وحالة كل علامة تبويب عند الانتقال بعيدًا عنها والعودة إليها، وهو السلوك المتوقع لعلامات التبويب السفلية.

دمج Scaffold

ضعوا كل شيء داخل Scaffold. ضعوا الشريط في bottomBar وNavHost ضمن المحتوى، مع استخدام المساحة المتروكة المتوفرة حتى لا يختفي المحتوى خلف الشريط.

Scaffold(
    bottomBar = { BottomBar(navController) }
) { padding ->
    NavHost(
        navController,
        startDestination = "home",
        modifier = Modifier.padding(padding)
    ) { /* destinations */ }
}

التكرار على العناصر

أنشئوا الشريط بالتكرار على قائمة علامات التبويب، ما يحافظ على قِصر الشيفرة واتساقها.

NavigationBar {
    tabs.forEach { tab ->
        NavigationBarItem(
            selected = currentRoute == tab.route,
            onClick = { navController.navigate(tab.route) },
            icon = { Icon(tab.icon, contentDescription = tab.label) },
            label = { Text(tab.label) }
        )
    }
}

تجميع الأجزاء

شريط سفلي كامل متصل بوحدة تحكّم، مع تمييز علامة التبويب النشطة.

@Composable
fun BottomBar(navController: NavController) {
    val entry by navController.currentBackStackEntryAsState()
    val current = entry?.destination?.route
    NavigationBar {
        tabs.forEach { tab ->
            NavigationBarItem(
                selected = current == tab.route,
                onClick = { navController.navigate(tab.route) },
                icon = { Icon(tab.icon, contentDescription = tab.label) },
                label = { Text(tab.label) }
            )
        }
    }
}

تحقّق سريع

كيف تعرفون أي NavigationBarItem يجب وضع علامة selected عليه؟

مراجعة

التنقّل السفلي:

  • يحتوي NavigationBar على عناصر NavigationBarItem.
  • تتبّعوا علامة التبويب النشطة عبر currentBackStackEntryAsState() وعيّنوا selected.
  • استخدموا popUpTo + launchSingleTop + saveState/restoreState للتبديل المنظّم بين علامات التبويب.
  • ضعوه داخل خانة bottomBar في Scaffold.

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

هل درس «التنقّل السفلي» مجاني؟

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

ماذا ستتعلم في «التنقّل السفلي»؟

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

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

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

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

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

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

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

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

  1. إعداد NavHost
  2. التنقّل بين الشاشات
  3. تمرير الوسائط
  4. التنقّل السفلي
← العودة إلى Android Academy