2017-09-27 134 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實現。 事件總線有很少的選擇。