สร้างแถบแอปด้านบนแบบไดนามิก

คู่มือนี้จะอธิบายวิธีสร้างแถบแอปด้านบนแบบไดนามิกใน "เขียน" ซึ่งจะเปลี่ยนตัวเลือกเมื่อเลือกรายการจากรายการ คุณสามารถแก้ไขชื่อและการดําเนินการของแถบแอปด้านบนตามสถานะการเลือกได้

ใช้ลักษณะการทํางานแบบไดนามิกของแถบแอปด้านบน

โค้ดนี้กำหนดฟังก์ชันคอมโพสิเบิลสำหรับแถบแอปด้านบนที่จะเปลี่ยนแปลงตามการเลือกรายการ

@Composable
fun AppBarSelectionActions(
    selectedItems: Set<Int>,
    modifier: Modifier = Modifier,
) {
    val hasSelection = selectedItems.isNotEmpty()
    val topBarText = if (hasSelection) {
        "Selected ${selectedItems.size} items"
    } else {
        "List of items"
    }

    TopAppBar(
        title = {
            Text(topBarText)
        },
        colors = TopAppBarDefaults.topAppBarColors(
            containerColor = MaterialTheme.colorScheme.primaryContainer,
            titleContentColor = MaterialTheme.colorScheme.primary,
        ),
        actions = {
            if (hasSelection) {
                IconButton(onClick = {
                    /* click action */
                }) {
                    Icon(
                        imageVector = Icons.Filled.Share,
                        contentDescription = "Share items"
                    )
                }
            }
        },
    )
}

ประเด็นสำคัญเกี่ยวกับรหัส

  • AppBarSelectionActions ยอมรับ Set ของดัชนีรายการที่เลือก
  • topBarText จะเปลี่ยนไปตามว่ามีการเลือกรายการใดไว้หรือไม่
    • เมื่อเลือกรายการแล้ว ข้อความที่อธิบายจำนวนรายการที่เลือกจะปรากฏใน TopAppBar
    • หากไม่ได้เลือกรายการใด topBarText จะแสดงเป็น "รายการ"
  • บล็อก actions จะกำหนดการดำเนินการที่แสดงในแถบแอปด้านบน หาก hasSelection เป็นจริง ไอคอนแชร์จะปรากฏหลังข้อความ
  • onClick lambda ของ IconButton จะจัดการการดําเนินการแชร์เมื่อมีการคลิกไอคอน

ผลลัพธ์

แถบแอปด้านบนแบบไดนามิกจะแสดงข้อความ &quot;เลือก 3 รายการแล้ว&quot; พร้อมไอคอนแชร์ ข้อความและไอคอนนี้จะปรากฏขึ้นเมื่อเลือกรายการเท่านั้น
รูปที่ 1 แถบแอปด้านบนแบบไดนามิกที่มีข้อความและไอคอนแชร์ที่ปรากฏขึ้นเมื่อเลือกรายการเท่านั้น

ผสานรวมรายการที่เลือกลงในแถบแอปด้านบนแบบไดนามิก

ตัวอย่างนี้แสดงวิธีเพิ่มรายการที่เลือกลงในแถบแอปด้านบนแบบไดนามิก

@Composable
private fun AppBarMultiSelectionExample(
    modifier: Modifier = Modifier,
) {
    val listItems by remember { mutableStateOf(listOf(1, 2, 3, 4, 5, 6)) }
    var selectedItems by rememberSaveable { mutableStateOf(setOf<Int>()) }

    Scaffold(
        topBar = { AppBarSelectionActions(selectedItems) }
    ) { innerPadding ->
        LazyColumn(contentPadding = innerPadding) {
            itemsIndexed(listItems) { _, index ->
                val isItemSelected = selectedItems.contains(index)
                ListItemSelectable(
                    selected = isItemSelected,
                    Modifier
                        .combinedClickable(
                            interactionSource = remember { MutableInteractionSource() },
                            indication = null,
                            onClick = {
                                /* click action */
                            },
                            onLongClick = {
                                if (isItemSelected) selectedItems -= index else selectedItems += index
                            }
                        )
                )
            }
        }
    }
}

ประเด็นสำคัญเกี่ยวกับรหัส

  • แถบด้านบนจะอัปเดตตามจํานวนรายการในรายการที่เลือก
  • selectedItems เก็บชุดดัชนีรายการที่เลือกไว้
  • AppBarMultiSelectionExample ใช้ Scaffold เพื่อจัดโครงสร้างหน้าจอ
    • topBar = { AppBarSelectionActions(selectedItems) } กำหนดคอมโพสิชัน AppBarSelectionActions เป็นแถบแอปด้านบน AppBarSelectionActions ได้รับสถานะ selectedItems
  • LazyColumn แสดงรายการในรายการแนวตั้ง โดยจะแสดงเฉพาะรายการที่มองเห็นบนหน้าจอ
  • ListItemSelectable แสดงรายการในลิสต์ที่เลือกได้
    • combinedClickable อนุญาตให้ทั้งการคลิกและการคลิกค้างไว้สําหรับการเลือกรายการ การคลิกจะดำเนินการต่างๆ ส่วนการคลิกรายการค้างไว้จะเปิด/ปิดสถานะการเลือก

ผลลัพธ์

แถบแอปด้านบนแบบไดนามิกจะแสดงข้อความ &quot;เลือก 3 รายการแล้ว&quot; ตามด้วยไอคอนแชร์ ด้านล่างจะมีรายการแสดงรายการต่างๆ พร้อมเครื่องหมายถูกข้างรายการที่เลือก 3 รายการ
รูปที่ 2 รายการที่ผสานรวมไว้ในแถบแอปด้านบนแบบไดนามิกโดยเลือกรายการที่เฉพาะเจาะจง

แหล่งข้อมูลเพิ่มเติม