2015-06-17 4 views
36

Я только что перенесла свой старый ActionBar на новый TabLayout (Дизайн материальной поддержки).onTabSelected Selected Not Called

Все отлично, но я не могу перехватить выбор закладки Метод onTabSelected вызывается только в первый раз, отображается TabLayout, но при нажатии вкладки, ничего не происходит! Любая идея, что не так с этим кодом?

tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    if (mViewPager != null) { 
     setupViewPager(); 
    } 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 

      numTab = tab.getPosition(); 
      prefs.edit().putInt("numTab", numTab).apply(); 

     } 

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

     } 

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

     } 
    }); 

    tabLayout.setupWithViewPager(mViewPager); 

ответ

85

При вызове setupWithViewPager, это будет внутренне назвать setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));, подменяют OnTabSelectedListener.

Вместо этого, ваш слушатель должен продлить TabLayout.ViewPagerOnTabSelectedListener, затем переопределить onTabSelected() и вызвать setOnTabSelectedListener() после setupWithViewPager():

tabLayout.setupWithViewPager(mViewPager); 
tabLayout.setOnTabSelectedListener(
    new TabLayout.ViewPagerOnTabSelectedListener(mViewPager) { 
    @Override 
    public void onTabSelected(TabLayout.Tab tab) { 
     super.onTabSelected(tab); 
     numTab = tab.getPosition(); 
     prefs.edit().putInt("numTab", numTab).apply(); 
    } 
}); 
+1

это правильно! –

+8

Вы на месте, это решило похожую ошибку для меня. Однако об этом факте не упоминается в документации для TabLayout.OnTabSelectedListener. Ваш ответ должен быть помещен в официальную документацию по Android. Моя основная ссылка должна быть документированием, а не переполнением стека. Еще раз спасибо за ответ. –

+1

Вышеуказанный ответ правильный! Но нет необходимости расширять слушателя. Просто вызов tabLayout.setupWithViewPager (mViewPager) до того, как tabLayout.setOnTabSelectedListener разрешит это. –

1

Вот несколько полнее пример с тремя вкладками. Он использует новый addOnTabSelectedListener, а не setOnTabSelectedListener.

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); 
tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); 
tabLayout.addTab(tabLayout.newTab().setText("Tab 3")); 
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 
final PagerAdapter adapter = new PagerAdapter 
     (getSupportFragmentManager(), tabLayout.getTabCount()); 
viewPager.setAdapter(adapter); 
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
    @Override 
    public void onTabSelected(TabLayout.Tab tab) { 
     viewPager.setCurrentItem(tab.getPosition()); 
     Log.i("TAG", "onTabSelected: " + tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(TabLayout.Tab tab) { 
     Log.i("TAG", "onTabUnselected: " + tab.getPosition()); 
    } 

    @Override 
    public void onTabReselected(TabLayout.Tab tab) { 
     Log.i("TAG", "onTabReselected: " + tab.getPosition()); 
    } 
}); 

Примечания:

  • onTabSelected и onTabUnselected называются каждый раз, когда происходит изменение в закладках.
  • onTabReselected вызывается всякий раз, когда вкладка снова нажата, пока она уже отображается.