2016-06-21 17 views
0

Problem: Ich verwende EventBus von greenrobot, um einige Ereignisse zu übergeben. Es funktioniert für mich leider für das Szenario der Weitergabe von Daten zwischen zwei fragments es nicht funktioniert. Das Ereignis wird also nicht ausgelöst.EventBus-Ereignis zwischen zwei nicht gefeuerten Fragmenten

Frage: Verkenne ich das Konzept? Oder gibt es einen Fehler in meinem Code?

Hinweis: Beide Fragmente existieren zum Zeitpunkt des Sendens des Ereignisses. Eine fragment ist die übergeordnete und die andere das Kind, um Details anzuzeigen.

fragment:

public class DetailFragment extends Fragment { 
(...) 

refreshButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
EventBus.getDefault().post(new IntentRefresh()); 
      } 
     }); 
(...) 

} 

EventBus Klasse:

public class IntentRefresh { 

    public IntentRefresh(){} 

    public void refreshParent() { 

    } 

} 

Elternfragment:

public class ParentFragment extends Fragment { 

    (...) 

    @Override 
    public void onPause() { 
     super.onPause(); 
     EventBus.getDefault().unregister(this); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     EventBus.getDefault().register(this); 
    } 

    @Subscribe(threadMode = ThreadMode.MAIN) 
    public void updateList(IntentRefresh intentRefresh) { 
     Toast.makeText(getActivity(), "LUEEEEPT", Toast.LENGTH_SHORT).show(); 
    } 

    (...) 
} 
+0

Sind beide Fragmente zur gleichen Zeit wieder aufgenommen? Stellen Sie sicher, dass das übergeordnete Fragment nicht pausiert ist, um es vom Bus abzubestellen. –

Antwort

4

Das Fragment Lebenszyklus ist ein bisschen komplizierter als die Aktivität Lebenszyklus. Ich nehme an, dass Ihre onResume() nicht so aufgerufen wird, wie Sie es für richtig halten. Ich würde empfehlen, die Registrierung und die Registrierung auf die Methoden onAttach() und onDetach() zu verschieben.

+0

brillante Antwort! – jublikon

+0

Vielen Dank. Sie arbeitet perfekt für mich –

0

Ich benutze @ CaseyB's Antwort. es funktioniert für mich perfekt. Wie unter

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (!EventBus.getDefault().isRegistered(this)) 
     EventBus.getDefault().register(this); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    EventBus.getDefault().unregister(this); 
} 

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(CallbackModel event) { 

}