如何从接收字符串值的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
相关产品推荐
相关产品推荐

