两个 Dialog Fragment 之间的通信 Android

Communication between two Dialog Fragment Android

我有一个带有自定义布局的对话框片段 (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);
}

onTimeSet(TimePicker view, int hourOfDay, int minute)

内部调用了方法timePicked(int hour, int minutes)

这是回调的全部代码

        @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 几乎完全相同的方法似乎不是让代码干净的想法。

getParentFragment() 没有获取父级,因为您使用的是 ActivityFragmentManager。为了使 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 或更推荐使用事件总线实现。 事件总线的替代方案很少。