【问题标题】:viewpager fragments not receiving otto events from activityviewpager 片段未从活动接收到 otto 事件
【发布时间】:2016-12-17 08:15:12
【问题描述】:

我有一个使用 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;
      }
    }

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

【问题讨论】:

  • 调用 post 方法时触发事件?
  • @sasikumar 我知道了问题的原因。在下面查看我的答案

标签: android android-fragments event-bus otto


【解决方案1】:

也许当事件到来时,事件总线还没有被注册,尤其是在 Fragment 的第一次初始化时。

所以你可以让EventBus.getInstance().register(this); 被调用onAttach() 并在onDettach 取消注册。

【讨论】:

  • 我知道了问题的原因。看我的回答
【解决方案2】:

问题是 onPageSelected(int position) 方法没有被调用,即使在我的 viewpager 上设置适配器并在我的活动 onCreate(Bundle savedInstanceState) 方法中调用 viewPager.setCurrentItem(0); 之后。

@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()。 只有第一页没有收到事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多