两个对话框片段Android之间的通信



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

的DialogFragment

是否有任何方法可以从parent对话fragment获取此接口的实例。或者,也许有一种更好的方法可以在这两个组件之间提供通信,因为对我定义OnTimePickedListener的方法几乎与TimePickerDialog.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,甚至可以使用更多建议使用EventBus实现。活动总线几乎没有其他选择。

最新更新