我和Viewpager有个活动。我的viewpager有几个片段。我想在片段被选中时向它发送Otto事件,因此我实现了ViewPager.OnPageChangeListener
@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;
}
}在我的第一个片段中
@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.......
}我的事件总线类
public class EventBus extends Bus {
private static EventBus eventBus;
public static EventBus getInstance(){
if(eventBus == null){
eventBus = new EventBus();
}
return eventBus;
}
}问题是我的片段没有接收到事件。可能的问题是什么?
发布于 2016-12-17 16:25:48
也许当事件发生时,eventbus还没有注册,特别是在片段的第一次初始化时。
所以你可以让EventBus.getInstance().register(this);在onAttach()中被调用,并在onDettach中注销。
发布于 2016-12-17 18:03:13
问题是即使在我的viewpager上设置了适配器并在我的activity onCreate(Bundle savedInstanceState)方法中缩放viewPager.setCurrentItem(0);之后,onPageSelected(int position)方法也不会被调用。
@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()方法手动调用onPageSelected(int position)。
viewPager.post(new Runnable() {
@Override
public void run() {
onPageSelected(viewPager.getCurrentItem());
}
});因此,我的总体onCreate(Bundle savedInstanceState)如下所示
@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());
}
});
}所有其他页面(片段)都在接收事件,因为当滚动离开第一个页面时,将调用onpageSelected()。它只是第一个没有接收事件的页面。
https://stackoverflow.com/questions/41196695
复制相似问题