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

조회수 3725회

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) {

         }
     });
  • (•́ ✖ •̀)
    알 수 없는 사용자

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에 특화된 콜백이 호출되는 것이 차이입니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)