รายละเอียดรายการเป็นรูปแบบ UI ที่ประกอบด้วยเลย์เอาต์แบบ 2 แผง โดยที่แผงหนึ่งแสดงรายการรายการต่างๆ และอีกแผงแสดงรายละเอียดของรายการที่เลือกจากรายการ
รูปแบบนี้มีประโยชน์อย่างยิ่งสําหรับแอปพลิเคชันที่ให้ข้อมูลเชิงลึกเกี่ยวกับองค์ประกอบของคอลเล็กชันขนาดใหญ่ เช่น โปรแกรมรับส่งอีเมลที่มีรายการอีเมลและเนื้อหาแบบละเอียดของข้อความอีเมลแต่ละรายการ นอกจากนี้ คุณยังใช้รายละเอียดรายการสำหรับเส้นทางที่ไม่สำคัญมากได้ เช่น การแบ่งค่ากำหนดของแอปออกเป็นรายการหมวดหมู่ที่มีค่ากำหนดสำหรับแต่ละหมวดหมู่ในแผงรายละเอียด
ใช้รูปแบบ UI ด้วย ListDetailPaneScaffold
ListDetailPaneScaffold
เป็นส่วนประกอบที่ช่วยให้การติดตั้งใช้งานรูปแบบรายการแบบละเอียดในแอปของคุณง่ายขึ้น โครงสร้างพื้นฐานรายการแบบละเอียดอาจมีแผงได้สูงสุด 3 แผง ได้แก่ แผงรายการ แผงรายละเอียด และแผงเพิ่มเติมที่ไม่บังคับ Scaffold จะจัดการการคำนวณพื้นที่หน้าจอ เมื่อหน้าจอมีขนาดใหญ่เพียงพอ แผงรายละเอียดจะแสดงควบคู่ไปกับแผงรายการ ในหน้าจอขนาดเล็ก โครงสร้างพื้นฐานจะเปลี่ยนเป็นการแสดงรายการหรือแผงรายละเอียดแบบเต็มหน้าจอโดยอัตโนมัติ
ประกาศทรัพยากร Dependency
ListDetailPaneScaffold
เป็นส่วนหนึ่งของไลบรารีเลย์เอาต์แบบปรับเปลี่ยนได้ของ Material 3
เพิ่ม 3 รายการต่อไปนี้ซึ่งเป็น Dependency ที่เกี่ยวข้องลงในไฟล์ build.gradle
ของแอปหรือโมดูล
Kotlin
implementation("androidx.compose.material3.adaptive:adaptive") implementation("androidx.compose.material3.adaptive:adaptive-layout") implementation("androidx.compose.material3.adaptive:adaptive-navigation")
Groovy
implementation 'androidx.compose.material3.adaptive:adaptive' implementation 'androidx.compose.material3.adaptive:adaptive-layout' implementation 'androidx.compose.material3.adaptive:adaptive-navigation'
- ปรับเปลี่ยนได้ — องค์ประกอบพื้นฐานระดับล่าง เช่น
HingeInfo
และPosture
- adaptive-layout — เลย์เอาต์แบบปรับอัตโนมัติ เช่น
ListDetailPaneScaffold
และSupportingPaneScaffold
- adaptive-navigation — Composables สําหรับไปยังส่วนต่างๆ ภายในและระหว่างแผง
การใช้งานพื้นฐาน
ติดตั้งใช้งาน ListDetailPaneScaffold
ดังนี้
ใช้คลาสที่แสดงถึงเนื้อหาที่จะเลือก คลาสนี้ควรเป็น
Parcelable
เพื่อรองรับการบันทึกและการกู้คืนรายการในลิสต์ที่เลือก ใช้ปลั๊กอิน kotlin-parcelize เพื่อสร้างโค้ดให้คุณ@Parcelize class MyItem(val id: Int) : Parcelable
สร้าง
ThreePaneScaffoldNavigator
ด้วยrememberListDetailPaneScaffoldNavigator
แล้วเพิ่มBackHandler
เครื่องมือนำทางนี้ใช้เพื่อไปยังส่วนต่างๆ ระหว่างรายการ รายละเอียด และแผงเพิ่มเติม การประกาศประเภททั่วไปจะทำให้เครื่องมือนำทางติดตามสถานะของสแคฟเฟิลด์ด้วย (นั่นคือMyItem
ที่แสดงอยู่) เนื่องจากประเภทนี้แบ่งออกเป็นส่วนๆ ได้ โปรแกรมนำทางจึงบันทึกและกู้คืนสถานะเพื่อจัดการการเปลี่ยนแปลงการกำหนดค่าโดยอัตโนมัติได้BackHandler
รองรับการนำทางกลับโดยใช้ท่าทางสัมผัสหรือการกดปุ่มย้อนกลับของระบบ ลักษณะการทํางานของปุ่มย้อนกลับสําหรับListDetailPaneScaffold
จะขึ้นอยู่กับขนาดหน้าต่างและค่าสแคฟเฟิลดปัจจุบัน หากListDetailPaneScaffold
รองรับการย้อนกลับด้วยสถานะปัจจุบันcanNavigateBack()
จะเป็นtrue
ซึ่งจะเปิดใช้BackHandler
val navigator = rememberListDetailPaneScaffoldNavigator<MyItem>() BackHandler(navigator.canNavigateBack()) { navigator.navigateBack() }
ส่ง
scaffoldState
จากnavigator
ไปยังคอมโพสิเบิลListDetailPaneScaffold
ListDetailPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, // ... )
ระบุการติดตั้งใช้งานแผงรายการไปยัง
ListDetailPaneScaffold
ใช้AnimatedPane
เพื่อใช้ภาพเคลื่อนไหวของแผงเริ่มต้นระหว่างการไปยังส่วนต่างๆ จากนั้นใช้ThreePaneScaffoldNavigator
เพื่อไปยังแผงรายละเอียดListDetailPaneScaffoldRole.Detail
และแสดงรายการที่ส่งListDetailPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, listPane = { AnimatedPane { MyList( onItemClick = { item -> // Navigate to the detail pane with the passed item navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, item) } ) } }, // ... )
ระบุการติดตั้งใช้งานแผงรายละเอียดใน
ListDetailPaneScaffold
เมื่อการนําทางเสร็จสมบูรณ์แล้วcurrentDestination
จะมีแผงที่แอปไปยัง รวมถึงเนื้อหาที่แสดงในแผง พร็อพเพอร์ตี้content
เป็นประเภทเดียวกับที่ระบุในคําเรียก remember เดิม (MyItem
ในตัวอย่างนี้) คุณจึงเข้าถึงพร็อพเพอร์ตี้เพื่อดูข้อมูลที่ต้องการแสดงได้ด้วยListDetailPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, listPane = // ... detailPane = { AnimatedPane { navigator.currentDestination?.content?.let { MyDetails(it) } } }, )
หลังจากทำตามขั้นตอนข้างต้นแล้ว โค้ดของคุณควรมีลักษณะดังนี้
val navigator = rememberListDetailPaneScaffoldNavigator<MyItem>() BackHandler(navigator.canNavigateBack()) { navigator.navigateBack() } ListDetailPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, listPane = { AnimatedPane { MyList( onItemClick = { item -> // Navigate to the detail pane with the passed item navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, item) }, ) } }, detailPane = { AnimatedPane { // Show the detail pane content if selected item is available navigator.currentDestination?.content?.let { MyDetails(it) } } }, )