2017-09-27 90 views
0

我有一个自定义布局的对话框片段(AddAlarmDialogFragment),点击TextView后又开始另一个对话框TimePickerFragment两个对话框片段之间的通信Android

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)

这是回调

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

的整个代码这里是一个问题,我想将时间从TimePickerDialog传递到AddAlarmDialogFragment,所以DialogFragment是h推出TimePickerFragment

有什么办法从父dialogFragment获取此接口的实例。或者,也许有更好的方法来提供这两个组件之间的沟通,因为对于我定义OnTimePickedListener几乎与TimePickerDialog.OnTimeSetListener几乎完全相同的方法看起来不知道哪个代码是干净的。

+0

因此'TimePickerFragment'启动'TimePickerDialog',并且你希望'TimePickerDialog'的一些数据能够返回到'TimePickerFragment'? – Jon

+0

我编辑我的问题,使其更清晰。我想将数据传递给打开TimePickerFragment的AddAlarmDialogFragment。这两个类都扩展了DialogFragment。我的目标是在AddAlarmDialogFragment的文本视图中编辑显示时间选择器的时间。 – GosiaK

+0

使用事件处理这类问题;发布者/订阅者设计模式应该工作;谷歌EventBus库的android – Eenvincible

回答

1

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"); 
    } 
} 
+0

我不知道'getChildFragmentManager()'为'DialogFragment's工作,但如果它的话,你应该完全走这条路线,因为它不紧密耦合组件。 – Jon

0

有没有通过引用应用程序的不同部分之间的通信几种方法在他们之间。 (去耦)

如果你认为你的代码会增长,并且你将会有几个组件相互通话,你可能需要考虑一个完整的解决方案。 你可以使用android LocalBroadcastManager或甚至更推荐使用eventbus实现。 事件总线有很少的选择。