2016-12-17 6 views
0

Viewpager에 대한 작업이 있습니다. 내 viewpager 몇 가지 단편이 있습니다. 내가 이렇게 내가 문제가뷰 페이지 프래그먼트가 액티비티의 이벤트를 수신하지 못합니다.

@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; 
     } 
    } 

첫 조각 내부 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; 
    } 
    } 

을 구현 선택하면 그 조각에 오토 이벤트를 보낼 내 파편들은 사건을받지 못한다. 무엇이 문제 일 수 있겠습니까?

+0

post 메서드를 호출하면 이벤트가 발생합니까? – sasikumar

+0

@ sasikumar 문제의 원인을 알게되었습니다. 아래 내 대답을 참조하십시오 –

답변

0

이벤트가 발생하면 이벤트 버스가 아직 등록되지 않았으며 특히 조각의 첫 번째 초기화 시간에 등록되지 않았습니다.

따라서 EventBus.getInstance().register(this);onAttach()에서 호출하고 onDettach에서 등록을 취소 할 수 있습니다.

+0

나는 문제의 원인을 알게되었습니다. 내 대답보기 –

0

내보기 페이지에서 어댑터를 설정하고 viewPager.setCurrentItem(0);의 내 활동 onCreate(Bundle savedInstanceState) 메서드에서 어댑터를 설정 한 후에도 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)onpageSelected() 멀리 첫 페이지에서 스크롤을 때 호출되기 때문에 다른 모든 페이지 (조각) 이벤트를 받고있는이

@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()); 
       } 
      }); 
     } 

처럼 보였다. 첫 번째 페이지는 이벤트를 수신하지 못한 페이지입니다.