两个Dialog Fragment Android之间的通信

时间:2017-09-27 15:33:37

标签: android android-dialogfragment

我有一个带有自定义布局的对话框片段(AddAlarmDialogFragment),在单击TextView后,它会启动另一个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将有关选择时间的信息传递给父DialogFragment

我让TimePickerFragment实现TimePickerDialog.OnTimeSetListener,来覆盖回调方法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)

内调用

这是callBack的整个代码

        @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        OnTimePickedListener onTimePickedListener=
OnTimePickedListener)getParentFragment();
        onTimePickedListener.timePicked(hourOfDay,minute);
    }

这是一个问题,我希望将时间从TimePickerDialog传递到AddAlarmDialogFragment,因此启动TimePickerFragment的DialogFragment

有没有办法从父dialogFragment获取此接口的实例。或者可能有更好的方法来提供这两个组件之间的通信,因为我定义OnTimePickedListenerTimePickerDialog.OnTimeSetListener几乎完全相同的方法似乎不知道是什么使代码清理。

2 个答案:

答案 0 :(得分:1)

getParentFragment()未获得父级,因为您正在使用FragmentManager的{​​{1}}。要使Activity有效,您需要在执行片段事务时使用getParentFragment()

但是,出于您的目的,您应该利用片段标记功能找到您要查找的片段:

getChildFragmentManager()

答案 1 :(得分:0)

在应用程序的不同部分之间进行通信的方法很少,而不会在它们之间传递引用。 (脱钩)

如果您认为您的代码会增长并且您将会有几个组件相互交流,那么您可能需要考虑一个完整的解决方案。 您可以使用android LocalBroadcastManager或甚至更多建议使用eventbus实现来实现此目的。 事件总线的替代品很少。