我有一个带有自定义布局的对话框片段( AddAlarmDialogFragment
),单击文本视图启动另一个 TimePickerFragment
。
TimePickerFragment正在显示timepickerdialog。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(),TimePickerDialog.THEME_HOLO_LIGHT, this, hour, minute,
true);
}
到目前为止,一切都在起作用,但是我希望timepickerfragment将有关选择的时间的信息传递给父对话fragment
我制作了实施TimePickerDialog.OnTimeSetListener,
的TimePickerFragment覆盖方法onTimeSet(TimePicker view, int hourOfDay, int minute)
。
我在timepickerfragment
内也声明了我的界面 public interface OnTimePickedListener {
void timePicked(int hour, int minutes);
}
该方法timePicked(int hour, int minutes)
在onTimeSet(TimePicker view, int hourOfDay, int minute)
这是回调的整个代码
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
OnTimePickedListener onTimePickedListener=
OnTimePickedListener)getParentFragment();
onTimePickedListener.timePicked(hourOfDay,minute);
}
这是一个问题,我想将时间从TimePickerDialog
转到AddAlarmDialogFragment
,因此启动TimePickerFragment
是否有任何方法可以从parent对话fragment获取此接口的实例。或者,也许有一种更好的方法可以在这两个组件之间提供通信,因为对我定义OnTimePickedListener
的方法几乎与TimePickerDialog.OnTimeSetListener
完全相同的方法似乎不知道是什么使代码清洁。
getParentFragment()
没有得到父,因为您使用的是Activity
的FragmentManager
。为了使getParentFragment()
工作,执行片段交易时需要使用getChildFragmentManager()
。
但是,出于您的目的,您应该只利用片段标记功能并找到所需的片段:
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Fragment fragment = getActivity().getSupportFragmentManager()
.findFragmentByTag(TimePickerFragment.TAG);
if (fragment == null) {
// the fragment we're looking for doesn't exist
return;
}
try {
OnTimePickedListener onTimePickedListener=(OnTimePickedListener)fragment;
onTimePickedListener.timePicked(hourOfDay,minute);
} catch (ClassCastException e) {
// the fragment we're looking for doesn't implement the proper callback
throw new ClassCastException(fragment.toString()
+ " must implement OnTimePickedListener");
}
}
在应用程序的不同部分之间没有几个方法之间的交流方式,而无需传递所有内容。(脱钩)
如果您认为您的代码会增长,并且您将有几个组件互相交谈,则可能需要考虑一个完整的解决方案。您可以使用Android LocalBroadcastManager,甚至可以使用更多建议使用EventBus实现。活动总线几乎没有其他选择。