2017-09-27 1 views
0

TextView를 클릭 한 후 또 다른 TimePickerFragment을 시작하는 사용자 정의 레이아웃이있는 대화 상자 부분 (AddAlarmDialogFragment)이 하나 있습니다.두 개의 대화 조각 사이의 통신 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이 콜백 메소드 onTimeSet(TimePicker view, int hourOfDay, int minute)를 재정의 TimePickerDialog.OnTimeSetListener,을 구현했다 고른 시간에 대한 정보를 전달하고 싶다.

나는, 방법 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); 
    } 

을 전체 코드 그리고 여기에 문제가 내부이라고 TimePickerFragment

public interface OnTimePickedListener { 
    void timePicked(int hour, int minutes); 
} 

안에도 내 인터페이스를 선언 TimePickerDialog에서 AddAlarmDialogFragment으로 시간을 보내려고하므로 DialogFragment가 h가 시작되었습니다 TimePickerFragment

부모 대화 상자에서이 인터페이스의 인스턴스를 가져올 수있는 방법이 있습니까? 아니면 TimePickerDialog.OnTimeSetListener과 거의 똑같은 방법을 가지고있는 OnTimePickedListener을 정의하는 것은 코드를 깨끗하게 만드는 아이디어가 아니기 때문에이 두 구성 요소 간의 통신을 제공하는 더 좋은 방법이 될 수 있습니다.

+0

그래서'TimePickerFragment'는'TimePickerDialog'을 시작하고'TimePickerDialog'의 어떤 데이터를'TimePickerFragment'로 되돌리려할까요? – Jon

+0

명확하게하기 위해 제 질문을 편집합니다. TimePickerFragment를 여는 AddAlarmDialogFragment에 데이터를 전달하고 싶습니다. 두 클래스 모두 DialogFragment를 확장하고 있습니다. 내 목표는 AddAlarmDialogFragment의 텍스트보기에서 시간 선택 도구에서 시간 표시를 편집하는 것입니다. – GosiaK

+0

사용 이벤트 이러한 종류의 이벤트; 게시자/구독자 디자인 패턴이 작동해야합니다. 안드로이드에 대한 Google EventBus 라이브러리 – 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

'DialogFragment'에 대해'getChildFragmentManager()'가 작동하는지 모르겠다.하지만 그렇다면 구성 요소를 단단히 연결하지 않기 때문에 완전히 그 경로로 가야한다. – Jon

0

참조를 통과하지 않고 응용 프로그램의 다른 부분 사이에 통신 할 수있는 몇 가지 방법이 있습니다 그들 사이의 모든. (디커플링)

코드가 커지고 두 가지 구성 요소가 서로 대화 할 것이라고 생각하면 완벽한 솔루션을 고려하는 것이 좋습니다. android LocalBroadcastManager를 사용하거나 이벤트 버스 구현을 사용하는 것이 좋습니다. 이벤트 버스에 대한 대안이 거의 없습니다.