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实现回调:
- 在
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); }); }
- 修改
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.
相关产品推荐
相关产品推荐

