如何将时间选择器的结果设置为TextField

问题描述

我想将时间选择器的结果设置为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
}
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...