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 // 关闭时间选择器})}} }