我有一个带有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;
}
}
问题是我的片段没有收到事件。有什么问题?
也许当事件到来时,EventBus尚未重新登录,在片段的第一个初始化时间中,尤其是在片段中。
因此,您可以在onAttach()
上打电话给EventBus.getInstance().register(this);
,并在onDettach
中取消注册。
问题是,即使在我的Activity onCreate(Bundle savedInstanceState)
方法中设置适配器和CALING 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()
。这只是没有收到活动的第一页。