Bộ chọn giờ

Bộ chọn giờ giúp người dùng chọn giờ. Bạn có thể sử dụng các thành phần kết hợp TimePickerTimeInput để triển khai bộ chọn giờ trong ứng dụng.

Loại

Có hai loại bộ chọn giờ:

  • Quay số: Cho phép người dùng đặt thời gian bằng cách di chuyển tay điều khiển quanh mặt số.
  • Đầu vào: Cho phép người dùng đặt thời gian bằng bàn phím.

Hình ảnh sau đây cung cấp ví dụ về bộ chọn thời gian quay số ở bên trái và bộ chọn thời gian nhập ở bên phải:

Một mặt đồng hồ và bộ chọn thời gian đầu vào.
Hình 1. Một mặt đồng hồ và một bộ chọn giờ đầu vào.

Nền tảng API

Để triển khai bộ chọn giờ, hãy sử dụng thành phần kết hợp TimePicker hoặc TimeInput:

  • TimePicker: Triển khai bộ chọn thời gian quay số.
  • TimeInput: Triển khai bộ chọn thời gian nhập.

Trạng thái

Đối với cả TimePickerTimeInput, bạn cũng phải truyền TimePickerState. Điều này cho phép bạn đặt thời gian đã chọn mặc định xuất hiện trên bộ chọn. Phương thức này cũng ghi lại thời gian mà người dùng đã chọn bằng bộ chọn.

Hộp thoại

Bộ chọn giờ xuất hiện trong hộp thoại. Các ví dụ trong hướng dẫn này không sử dụng hộp thoại. Để biết các ví dụ sử dụng hộp thoại, hãy xem hướng dẫn Hộp thoại cho bộ chọn thời gian.

Bộ chọn giờ trên mặt đồng hồ

Đoạn mã này minh hoạ cách triển khai bộ chọn thời gian quay số cơ bản.

@Composable
fun DialExample(
    onConfirm: () -> Unit,
    onDismiss: () -> Unit,
) {
    val currentTime = Calendar.getInstance()

    val timePickerState = rememberTimePickerState(
        initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
        initialMinute = currentTime.get(Calendar.MINUTE),
        is24Hour = true,
    )

    Column {
        TimePicker(
            state = timePickerState,
        )
        Button(onClick = onDismiss) {
            Text("Dismiss picker")
        }
        Button(onClick = onConfirm) {
            Text("Confirm selection")
        }
    }
}

Hãy cân nhắc những điều sau trong đoạn mã này:

  • Calendar.getInstance() khởi chạy TimePickerState bằng thời gian hiện tại.
    • Ví dụ này sử dụng java.util.Calendar. Bật tính năng đơn giản hoá API Java 8 trở lên trong dự án để sử dụng java.time.LocalTime trên tất cả các phiên bản Android.
  • Thành phần kết hợp TimePicker hiển thị bộ chọn giờ, lấy timePickerState làm tham số.
  • Quá trình triển khai bao gồm 2 nút: một nút để xác nhận lựa chọn và nút còn lại để đóng bộ chọn.

Phương thức triển khai có dạng như sau:

Bộ chọn giờ dạng mặt đồng hồ. Người dùng có thể chọn thời gian bằng cách sử dụng mặt đồng hồ.
Hình 2. Bộ chọn giờ dạng mặt đồng hồ.

Nhập bộ chọn giờ

Đoạn mã này minh hoạ cách triển khai bộ chọn thời gian của kiểu nhập cơ bản.

@Composable
fun InputExample(
    onConfirm: () -> Unit,
    onDismiss: () -> Unit,
) {
    val currentTime = Calendar.getInstance()

    val timePickerState = rememberTimePickerState(
        initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
        initialMinute = currentTime.get(Calendar.MINUTE),
        is24Hour = true,
    )

    Column {
        TimeInput(
            state = timePickerState,
        )
        Button(onClick = onDismiss) {
            Text("Dismiss picker")
        }
        Button(onClick = onConfirm) {
            Text("Confirm selection")
        }
    }
}

Những điểm chính cần lưu ý trong quá trình triển khai này:

  • Về cơ bản, cấu trúc này giống với bộ chọn thời gian quay số, điểm khác biệt chính là việc sử dụng TimeInput thay vì TimePicker.
  • Tham số is24Hour cho timePickerState được đặt rõ ràng thành true. Theo mặc định, giá trị này là false.

Phương thức triển khai có dạng như sau:

Bộ chọn thời gian nhập. Người dùng có thể nhập thời gian bằng trường văn bản.
Hình 3. Bộ chọn giờ nhập.

Sử dụng trạng thái

Để tận dụng thời gian mà người dùng đã chọn trong một bộ chọn giờ, hãy chuyển TimePickerState thích hợp vào hàm onConfirm của bạn. Sau đó, thành phần kết hợp mẹ có thể truy cập vào thời gian đã chọn thông qua TimePickerState.hourTimePickerState.minute.

Đoạn mã sau đây minh hoạ cách thực hiện việc này:

@Composable
fun DialUseStateExample(
    onConfirm: (TimePickerState) -> Unit,
    onDismiss: () -> Unit,
) {
    val currentTime = Calendar.getInstance()

    val timePickerState = rememberTimePickerState(
        initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
        initialMinute = currentTime.get(Calendar.MINUTE),
        is24Hour = true,
    )

    Column {
        TimePicker(
            state = timePickerState,
        )
        Button(onClick = onDismiss) {
            Text("Dismiss picker")
        }
        Button(onClick = { onConfirm(timePickerState) }) {
            Text("Confirm selection")
        }
    }
}

Sau đó, bạn có thể gọi thành phần kết hợp như sau:

var selectedTime: TimePickerState? by remember { mutableStateOf(null) }

// ...

DialUseStateExample(
    onDismiss = {
        showDialExample = false
    },
    onConfirm = {
            time ->
        selectedTime = time
        showDialExample = false
    },
)

// ...

if (selectedTime != null) {
    val cal = Calendar.getInstance()
    cal.set(Calendar.HOUR_OF_DAY, selectedTime!!.hour)
    cal.set(Calendar.MINUTE, selectedTime!!.minute)
    cal.isLenient = false
    Text("Selected time = ${formatter.format(cal.time)}")
} else {
    Text("No time selected.")
}

Để biết thêm thông tin chi tiết, hãy xem phần triển khai đầy đủ trong ứng dụng đoạn mã.

Tài nguyên khác