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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:06:13