2016-12-17 2 views
0

Otton I ont une activité avec un Viewpager. mon viewpager a plusieurs fragments. Je veux envoyer un événement Otto à un fragment lorsqu'il est sélectionné, donc je mets en œuvre ViewPager.OnPageChangeListenerfragments de viewpager ne recevant pas les événements de l'activité

 @Override 
    public void onPageSelected(int position) { 
    currentPosition = position; 
    switch (position){ 
     case 0: 
     EventBus.getInstance().post(new TypeEvent()); 
     break; 
     case 1: 
     EventBus.getInstance().post(new InternalEvent()); 
     break; 
    } 
    } 

intérieur de mon premier fragment

@Override 
    public void onStart() { 
    super.onStart(); 
    EventBus.getInstance().register(this); 
    } 

    @Override 
    public void onStop(){ 
    super.onStop(); 
    EventBus.getInstance().unregister(this); 
    } 

    @Subscribe 
    public void init(TypeEvent event){ 
    Logger.d("type event received"); 
    //do something....... 
    } 

Mon bus d'événements classe

public class EventBus extends Bus { 

    private static EventBus eventBus; 

    public static EventBus getInstance(){ 
     if(eventBus == null){ 
      eventBus = new EventBus(); 
     } 
     return eventBus; 
     } 
    } 

Le problème est mes fragments ne reçoivent pas d'événements. quel pourrait être le problème?

+0

événement est le feu lorsque vous appelez méthode post? – sasikumar

+0

@sasikumar J'ai appris à connaître la cause du problème. voir ma réponse ci-dessous –

Répondre

0

Peut-être que lorsque l'événement arrive, le EventBus n'a pas été registed encore, especilly à la première fois d'initialisation du fragment.

Vous pouvez donc appeler EventBus.getInstance().register(this); à onAttach() et vous désinscrire au onDettach.

+0

j'ai appris à connaître la cause du problème. voir ma réponse –

0

Le problème était que la méthode onPageSelected(int position) n'était pas appelée même après le réglage de l'adaptateur sur mon viewpager et l'appel viewPager.setCurrentItem(0); dans mon activité onCreate(Bundle savedInstanceState) méthode.

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pm); 
    Toolbar toolbar =(Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    viewPager = (ViewPager)findViewById(R.id.pmViewpager); 

    viewPager.addOnPageChangeListener(this); 
    viewPager.setAdapter(new CustomAdapter(getSupportFragmentManager())); 

    viewPager.setCurrentItem(currentPosition); 
    } 

je devais appeler manuellement onPageSelected(int position) par la méthode post() de viewpager.

viewPager.post(new Runnable() { 
      @Override 
      public void run() { 
      onPageSelected(viewPager.getCurrentItem()); 
      } 
     }); 

Ainsi mon onCreate(Bundle savedInstanceState) ensemble ressemblait à ce

@Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pm); 
     Toolbar toolbar =(Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     viewPager = (ViewPager)findViewById(R.id.pmViewpager); 

     viewPager.addOnPageChangeListener(this); 
     viewPager.setAdapter(new CustomAdapter(getSupportFragmentManager())); 

     viewPager.setCurrentItem(currentPosition); 

viewPager.post(new Runnable() { 
       @Override 
       public void run() { 
       onPageSelected(viewPager.getCurrentItem()); 
       } 
      }); 
     } 

Toutes les autres pages (fragments) reçoivent les événements, car onpageSelected() sera appelée quand on scroll loin de la première page. c'est seulement la première page qui ne recevait pas l'événement.