问题描述
我想将时间选择器的结果设置为TextField,如何通过onValueChange实现它?
@Composable
fun TestTimePickerTextField(
selectTime: (Context) -> String
) {
val context = ContextAmbient.current
TextField(
// How to pass result to TextField
)
}
// viewmodel
fun selectTime(context: Context): String {
var time = ""
val currentDateTime = Calendar.getInstance()
val startYear = currentDateTime.get(Calendar.YEAR)
val startMonth = currentDateTime.get(Calendar.MONTH)
val startDay = currentDateTime.get(Calendar.DAY_OF_MONTH)
val startHour = currentDateTime.get(Calendar.HOUR_OF_DAY)
val startMinute = currentDateTime.get(Calendar.MINUTE)
DatePickerDialog(context,{ _,year,month,day ->
TimePickerDialog(context,hour,minute ->
val pickedDateTime = Calendar.getInstance()
pickedDateTime.set(year,day,minute)
time = "$year-$month-$day $hour:$minute"
},startHour,startMinute,false).show()
},startYear,startMonth,startDay).show()
return time
}
解决方法
ViewModel不应包含具有上下文的方法。将所有与Android相关的代码放入活动/片段中。
活动中:
@Composable
fun init() {
val time by viewModel.time.observeAsState()
MaterialTheme {
Column {
TextButton(onClick = { selectTime() }) {
Text("Select time")
}
Text(time ?: "no time set")
}
}
}
private fun selectTime(): String {
var time = ""
val currentDateTime = Calendar.getInstance()
val startYear = currentDateTime.get(Calendar.YEAR)
val startMonth = currentDateTime.get(Calendar.MONTH)
val startDay = currentDateTime.get(Calendar.DAY_OF_MONTH)
val startHour = currentDateTime.get(Calendar.HOUR_OF_DAY)
val startMinute = currentDateTime.get(Calendar.MINUTE)
DatePickerDialog(this,{ _,year,month,day ->
TimePickerDialog(context,hour,minute ->
val pickedDateTime = Calendar.getInstance()
pickedDateTime.set(year,day,minute)
time = "$year-$month-$day $hour:$minute"
viewModel.updateTime(time)
},startHour,startMinute,false).show()
},startYear,startMonth,startDay).show()
return time
}
ViewModel类:
class MainViewModel : ViewModel() {
var time = MutableLiveData<String>()
fun updateTime(time: String) {
this.time.value = time
}
}