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

Fragment调用TimePickerFragment时onTimeSet方法不生效问题

问题根因

你实现的onTimeSet未触发是因为2处绑定逻辑错误:

  • 创建TimerPickerFragment实例后未设置目标Fragment,导致getTargetFragment()返回null,TimePickerDialog找不到回调接口
  • 嵌套的DialogFragment错误使用了Activity级别的FragmentManager,生命周期绑定异常

修复方案(兼容低版本写法)

修改Fragment_alarm中打开时间选择器的点击逻辑,增加targetFragment绑定、改用子FragmentManager:

buttonTimePicker.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DialogFragment timePicker = new TimerPickerFragment();
        // 绑定当前Fragment为回调接收方
        timePicker.setTargetFragment(Fragment_alarm.this, 1001);
        // 改用当前Fragment的子Fragment管理器
        timePicker.show(getChildFragmentManager(), "time picker");
    }
});

可选:AndroidX高版本推荐写法(替代已废弃的setTargetFragment)

如果你的项目依赖较新版本的AndroidX,推荐使用官方推荐的Fragment Result API实现回调:

  1. 在Fragment_alarm的onCreate生命周期中注册结果监听:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getChildFragmentManager().setFragmentResultListener("time_picker_result", this, (requestKey, result) -> {
        int hour = result.getInt("select_hour");
        int minute = result.getInt("select_minute");
        // 执行原来onTimeSet中的逻辑
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);
        updateTimeText(c);
        startAlarm(c);
    });
}
  1. 修改TimerPickerFragment的实现,通过Result API回传选择结果:
public class TimerPickerFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        return new TimePickerDialog(requireContext(), (view, hourOfDay, selectMinute) -> {
            Bundle result = new Bundle();
            result.putInt("select_hour", hourOfDay);
            result.putInt("select_minute", selectMinute);
            getParentFragmentManager().setFragmentResult("time_picker_result", result);
        }, hour, minute, DateFormat.is24HourFormat(requireContext()));
    }
}

修改完成后重新运行即可触发onTimeSet逻辑,正常更新TextView内容。

内容的提问来源于stack exchange,提问作者Vishal A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 21:45:10