안드로이드 viewPager.addOnPageChangeListener와 tabLayout.addOnTabSelectedListener의 차이에 대한 질문입니다.


ViewPager에서 addOnPageChangeListener 와

TabLayout에서addOnTabSelectedListener 의 차이가 뭘끼요?

둘다 탭 변화에 대한 리스너 같은데 차이를 잘 모르겠습니다.

    TabPagerAdapter pagerAdapter = new TabPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(pagerAdapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    // Set TabSelectedListener
     tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
         @Override
         public void onTabSelected(TabLayout.Tab tab) {
             viewPager.setCurrentItem(tab.getPosition());
         }

         @Override
         public void onTabUnselected(TabLayout.Tab tab) {

         }

         @Override
         public void onTabReselected(TabLayout.Tab tab) {

         }
     });

조회수 589


1 답변


좋아요
1
싫어요
채택취소하기

위 코드에서 ViewPager의 addOnPageChangeListener는 ViewPager의 페이지가 스크롤 될 때 이를 TabLayout에게 알리기 위한 용도입니다. 가령 사용자가 ViewPager를 첫번째 페이지에서 두번째 페이지로 스와이프 했을 때 탭 또한 첫번째에서 두번째로 선택이 변경되길 기대할 것 입니다. 즉, ViewPager의 스크롤 상태와 TabLayout의 UI 상태를 동기화 시키기 위한 것입니다. 해당 코드를 주석처리하면 이 부분이 제대로 동작하지 않는 것을 확인할 수 있습니다. 실제 파라미터로 전달되는 TabLayout.TabLayoutOnPageChangeListener 코드를 보면 수행되는 작업은 다음과 같습니다. (코드가 길어 일부 생략)

@Override
public void onPageScrolled(int position, float positionOffset,
        int positionOffsetPixels) {
    ...
    final boolean updateText = mScrollState != SCROLL_STATE_SETTLING ||mPreviousScrollState == SCROLL_STATE_DRAGGING;    
    final boolean updateIndicator = !(mScrollState == SCROLL_STATE_SETTLING && mPreviousScrollState == SCROLL_STATE_IDLE);
    tabLayout.setScrollPosition(position, positionOffset, updateText, updateIndicator);
}

@Override
public void onPageSelected(int position) {
    final boolean updateIndicator = mScrollState == SCROLL_STATE_IDLE 
    || (mScrollState == SCROLL_STATE_SETTLING
     && mPreviousScrollState == SCROLL_STATE_IDLE);
    tabLayout.selectTab(tabLayout.getTabAt(position), updateIndicator);
}

TabLayout의 addOnTabSelectedListener는 탭의 선택 상태를 제공하기 위한 API 입니다. 이 함수는 구현에 따라 사용할 수도 그렇지 않을 수도 있습니다. addOnPageChangeListener와 비슷하게 보이지만 TabLayout에 특화된 콜백이 호출되는 것이 차이입니다.


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close