Android中TimePickerDialog的onTimeSet未触发,时间无法写入EditText
首先,你的核心问题是弹出的TimePickerFragment实例没有绑定OnTimeSetListener,导致选中时间后onTimeSet方法根本没被调用。咱们一步步来修正:
1. 修复Listener绑定问题
你在代码里先执行了TimePickerFragment.newInstance().setListener(this);,这只是创建了一个临时的TimePickerFragment实例并设置了监听,但这个实例并没有被用来弹出对话框。而你在点击事件里又重新new了一个全新的TimePickerFragment,这个新实例的listener是null,所以选中时间后不会回调onTimeSet方法。
修改点击事件里的代码,给弹出的实例直接设置listener:
starttime.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimePickerFragment timepicker = TimePickerFragment.newInstance(); timepicker.setListener(CreateClass.this); // 给当前弹出的实例绑定监听 timepicker.show(getFragmentManager(), "time picker"); flag = 1; } }); endtime.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimePickerFragment timepicker = TimePickerFragment.newInstance(); timepicker.setListener(CreateClass.this); timepicker.show(getFragmentManager(), "time picker"); flag = 2; } });
这样弹出的TimePickerFragment就有了正确的监听,选中时间后会触发onTimeSet方法。
2. 修复其他潜在问题
除了核心的listener问题,还有几个小问题可能导致显示异常:
(1)初始化flag变量
你需要在CreateClass里先初始化flag,避免空值问题:
private int flag = 0; // 初始值设为0
(2)处理凌晨12点(h=0)的情况
当前代码里h<12且h!=0才设置文本,h=0时会导致EditText无内容,补充这个分支:
else if (h < 12) { if (h != 0) { stimeedit.setText(String.valueOf(h) + ":" + String.format("%02d", m) + " am"); } else { // 处理凌晨12点 stimeedit.setText("12:" + String.format("%02d", m) + " am"); } }
结束时间的分支也要做同样修改。
(3)优化时间字符串格式
用String.format格式化分钟,保证两位数显示(比如将3转为03),避免格式混乱:
stimeedit.setText(String.valueOf(h-12) + ":" + String.format("%02d", m) + " pm");
(4)修正CreateClass的继承问题
你代码里写的public class CreateClass extends DialogFragment,但你描述这是FragmentActivity,这里应该继承AppCompatActivity或FragmentActivity:
public class CreateClass extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener { // ... 你的代码 }
3. 完整修正后的关键代码示例
TimePickerFragment保持不变
你的TimePickerFragment代码逻辑没问题,无需修改。
CreateClass修正后代码片段
public class CreateClass extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener { private int flag = 0; private EditText stimeedit, etimeedit; private Button starttime, endtime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_class); // 初始化控件 stimeedit = findViewById(R.id.stimeedit); etimeedit = findViewById(R.id.etimeedit); starttime = findViewById(R.id.starttime); endtime = findViewById(R.id.endtime); starttime.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimePickerFragment timepicker = TimePickerFragment.newInstance(); timepicker.setListener(CreateClass.this); timepicker.show(getSupportFragmentManager(), "time picker"); flag = 1; } }); endtime.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimePickerFragment timepicker = TimePickerFragment.newInstance(); timepicker.setListener(CreateClass.this); timepicker.show(getSupportFragmentManager(), "time picker"); flag = 2; } }); } @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Displaytime(hourOfDay, minute); } public void Displaytime(int h, int m) { String timeStr; if (flag == 1) { if (h > 12) { timeStr = String.valueOf(h - 12) + ":" + String.format("%02d", m) + " pm"; } else if (h == 12) { timeStr = "12:" + String.format("%02d", m) + " pm"; } else { timeStr = h == 0 ? "12:" + String.format("%02d", m) + " am" : String.valueOf(h) + ":" + String.format("%02d", m) + " am"; } stimeedit.setText(timeStr); } else if (flag == 2) { if (h > 12) { timeStr = String.valueOf(h - 12) + ":" + String.format("%02d", m) + " pm"; } else if (h == 12) { timeStr = "12:" + String.format("%02d", m) + " pm"; } else { timeStr = h == 0 ? "12:" + String.format("%02d", m) + " am" : String.valueOf(h) + ":" + String.format("%02d", m) + " am"; } etimeedit.setText(timeStr); } } }
这样修改后,点击按钮弹出时间选择器,选中时间后就能正确显示到对应的EditText里了。
内容的提问来源于stack exchange,提问作者Ayesha Anika

