首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >viewpager片段未从activity接收otto事件

viewpager片段未从activity接收otto事件
EN

Stack Overflow用户
提问于 2016-12-17 16:15:13
回答 2查看 389关注 0票数 0

我和Viewpager有个活动。我的viewpager有几个片段。我想在片段被选中时向它发送Otto事件,因此我实现了ViewPager.OnPageChangeListener

代码语言:javascript
复制
     @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;
    }
  }

在我的第一个片段中

代码语言:javascript
复制
@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.......
  }

我的事件总线类

代码语言:javascript
复制
    public class EventBus extends Bus {

   private static EventBus eventBus;

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

问题是我的片段没有接收到事件。可能的问题是什么?

EN

回答 2

Stack Overflow用户

发布于 2016-12-17 16:25:48

也许当事件发生时,eventbus还没有注册,特别是在片段的第一次初始化时。

所以你可以让EventBus.getInstance().register(this);onAttach()中被调用,并在onDettach中注销。

票数 0
EN

Stack Overflow用户

发布于 2016-12-17 18:03:13

问题是即使在我的viewpager上设置了适配器并在我的activity onCreate(Bundle savedInstanceState)方法中缩放viewPager.setCurrentItem(0);之后,onPageSelected(int position)方法也不会被调用。

代码语言:javascript
复制
@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)

代码语言:javascript
复制
viewPager.post(new Runnable() {
          @Override
          public void run() {
            onPageSelected(viewPager.getCurrentItem());
          }
        });

因此,我的总体onCreate(Bundle savedInstanceState)如下所示

代码语言:javascript
复制
@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()。它只是第一个没有接收事件的页面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41196695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档