AI生成,調試出來學習,這些小組件會用了,就可以組合一個大點的程序了。
package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.* import androidx.compose.foundation.clickable import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.Alignment import androidx.compose.ui.unit.dp import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.util.* import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.window.Dialog import com.example.mydatetime.ui.theme.MyDateTimeTheme import java.time.Instant import java.time.LocalDate import java.time.LocalTime import java.time.ZoneIdclass MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContent {MyDateTimeTheme {DateAndTimePickerApp()}}} }@OptIn(ExperimentalMaterial3Api::class) @Composable fun DatePickerDialog(onDismissRequest: () -> Unit,onDateSelected: (LocalDate) -> Unit ) {// 獲取當前日期val currentDate = LocalDate.now()// 創建DatePicker狀態,并初始化為當前日期val datePickerState = rememberDatePickerState(initialSelectedDateMillis = currentDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli())// 創建對話框Dialog(onDismissRequest = onDismissRequest,) {// 使用Column布局來組織對話框內容Column(modifier = Modifier.fillMaxWidth().padding(16.dp)) {// 顯示標題Text(text = "Select Date",style = MaterialTheme.typography.headlineSmall,modifier = Modifier.padding(bottom = 16.dp))// 顯示日期選擇器DatePicker(state = datePickerState)// 使用Row布局來組織按鈕Row(modifier = Modifier.fillMaxWidth().padding(top = 16.dp),horizontalArrangement = Arrangement.End) {// 取消按鈕Button(onClick = onDismissRequest,modifier = Modifier.padding(end = 8.dp)) {Text("Cancel")}// 確定按鈕Button(onClick = {// 獲取選中的日期val selectedDate = LocalDate.ofInstant(Instant.ofEpochMilli(datePickerState.selectedDateMillis ?: currentDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli()),ZoneId.systemDefault())// 調用回調函數,傳遞選中的日期onDateSelected(selectedDate)}) {Text("OK")}}}} }@OptIn(ExperimentalMaterial3Api::class) // 使用實驗性API的注解 @Composable // 標記為可組合函數 fun TimePickerDialog(onDismissRequest: () -> Unit, // 對話框關閉時的回調函數onTimeSelected: (LocalTime) -> Unit // 時間選擇后的回調函數 ) {val currentTime = LocalTime.now(ZoneId.systemDefault()) // 獲取當前時間val timePickerState = rememberTimePickerState(initialHour = currentTime.hour, initialMinute = currentTime.minute) // 創建時間選擇器的狀態,并初始化為當前時間Dialog(onDismissRequest = onDismissRequest, // 設置對話框關閉的回調函數) {Column(modifier = Modifier.fillMaxWidth() // 填充父布局的寬度.padding(16.dp) // 設置內邊距) {Text(text = "Select Time", // 顯示文本style = MaterialTheme.typography.headlineSmall, // 使用主題中的小標題樣式modifier = Modifier.padding(bottom = 16.dp) // 設置底部內邊距)TimePicker(state = timePickerState) // 顯示時間選擇器Row(modifier = Modifier.fillMaxWidth() // 填充父布局的寬度.padding(top = 16.dp), // 設置頂部內邊距horizontalArrangement = Arrangement.End // 水平排列方式為靠右) {Button(onClick = onDismissRequest, // 點擊按鈕時調用關閉回調函數modifier = Modifier.padding(end = 8.dp) // 設置右邊距) {Text("Cancel") // 顯示取消文本}Button(onClick = {val selectedTime = LocalTime.of(timePickerState.hour, timePickerState.minute) // 獲取選中的時間onTimeSelected(selectedTime) // 調用時間選擇后的回調函數}) {Text("OK") // 顯示確定文本}}}} }@Composable fun DateAndTimePickerApp() {// 記住是否顯示日期選擇器的狀態var showDatePicker by remember { mutableStateOf(false) }// 記住是否顯示時間選擇器的狀態var showTimePicker by remember { mutableStateOf(false) }// 記住當前選中的日期和時間var selectedDateTime by remember { mutableStateOf(LocalDateTime.now()) }// 日期格式化器val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.getDefault())// 時間格式化器val timeFormatter = DateTimeFormatter.ofPattern("HH:mm", Locale.getDefault())// 使用Column布局,垂直居中,水平居中Column(modifier = Modifier.fillMaxSize().padding(16.dp),verticalArrangement = Arrangement.Center,horizontalAlignment = Alignment.CenterHorizontally) {// 顯示當前日期Text(text = "Date: ${selectedDateTime.format(dateFormatter)}",style = MaterialTheme.typography.bodyLarge,modifier = Modifier.clickable { showDatePicker = true } // 點擊時顯示日期選擇器.padding(8.dp))Spacer(modifier = Modifier.height(16.dp)) // 添加間距// 顯示當前時間Text(text = "Time: ${selectedDateTime.format(timeFormatter)}",style = MaterialTheme.typography.bodyLarge,modifier = Modifier.clickable { showTimePicker = true } // 點擊時顯示時間選擇器.padding(8.dp))// 日期選擇器if (showDatePicker) {DatePickerDialog(onDismissRequest = { showDatePicker = false }, // 點擊外部時關閉日期選擇器onDateSelected = { date ->// 更新選中的日期selectedDateTime = selectedDateTime.withYear(date.year).withMonth(date.monthValue).withDayOfMonth(date.dayOfMonth)showDatePicker = false // 關閉日期選擇器})}// 時間選擇器if (showTimePicker) {TimePickerDialog(onDismissRequest = { showTimePicker = false }, // 點擊外部時關閉時間選擇器onTimeSelected = { time ->// 更新選中的時間selectedDateTime = selectedDateTime.withHour(time.hour).withMinute(time.minute)showTimePicker = false // 關閉時間選擇器})}} }