0Pricing
Android Academy · บทเรียน

การนำทางด้านล่าง

สร้างการนำทางด้านล่างแบบแท็บ

การนำทางด้านล่าง เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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

คำถามที่พบบ่อย

บทเรียน “การนำทางด้านล่าง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การนำทางด้านล่าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การนำทางด้านล่าง”

สร้างการนำทางด้านล่างแบบแท็บ คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การนำทางด้านล่าง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า NavHost
  2. การนำทางระหว่างหน้าจอ
  3. การส่งอาร์กิวเมนต์
  4. การนำทางด้านล่าง
← กลับไปที่ Android Academy