You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从接收字符串值的EditText中提取时间赋值给时间变量

问题根因

  • TimePickerDialog是异步弹窗控件,picker.show()执行后不会阻塞当前线程,写在show()之后的赋值代码会立即执行,此时用户还未完成时间选择,onTimeSet回调尚未触发,eText还未更新为选中的时间值,因此拿不到目标时间。
  • 注释掉的赋值代码执行时机不对,是无法给时间变量赋值的核心原因。

解决方法

将时间赋值逻辑移动到onTimeSet回调内部执行,此时回调已经返回用户选中的小时sHour和分钟sMinute,可以直接用这两个值构造时间变量,也可以取更新后的eText内容:

eText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final Calendar cldr = Calendar.getInstance();
        int hour = cldr.get(Calendar.HOUR_OF_DAY);
        int minutes = cldr.get(Calendar.MINUTE);
        // 时间选择器弹窗
        picker = new TimePickerDialog(AddMeeting.this,
                new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker tp, int sHour, int sMinute) {
                        // 给时间补前导零,避免出现9:5这类不规范格式
                        String selectTime = String.format("%02d:%02d", sHour, sMinute);
                        eText.setText(selectTime);
                        // 在这里完成时间变量赋值
                        // 方式1:直接用回调返回的小时分钟构造时间对象,无需从eText读取
                        if (time1 instanceof Calendar) {
                            time1.set(Calendar.HOUR_OF_DAY, sHour);
                            time1.set(Calendar.MINUTE, sMinute);
                        }
                        // 方式2:如果需要字符串转时间,也可以在这里执行
                        // time1 = selectTime.toTime();
                    }
                }, hour, minutes, true);
        picker.show();
    }
});
final Calendar myCalendar = Calendar.getInstance();

注意事项

如果你的time1是当前方法内的局部变量,直接在OnTimeSetListener内部访问会触发编译报错,需要将time1调整为当前Activity的成员变量,即可在回调内部直接赋值。

内容的提问来源于stack exchange,提问作者Jatt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:30:01