2015-06-17 15 views
36

Ho appena migrato il mio vecchio ActionBar a nuovo TabLayout (Supporto materiale di progettazione).onTabSelezionato selezionato non chiamato

Tutto è grande, ma non posso intercettare selezione della scheda Il metodo onTabSelected viene chiamato solo la prima volta che viene visualizzata TabLayout, ma quando si fa clic schede, non succede nulla! Qualche idea di cosa non funziona con questo codice?

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

risposta

85

Quando si chiama setupWithViewPager, questo sarà internamente chiamare setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));, sovrascrivendo il tuo OnTabSelectedListener.

Invece, il vostro ascoltatore dovrebbe estendere TabLayout.ViewPagerOnTabSelectedListener, poi ignorare onTabSelected() e chiamare setOnTabSelectedListener() dopo 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

questo è corretto! –

+8

Sei azzeccato, questo ha risolto un bug simile per me. Tuttavia, non vi è alcun riferimento a questo fatto nella documentazione di TabLayout.OnTabSelectedListener. La tua risposta dovrebbe essere inserita nella documentazione ufficiale di Android. Il mio riferimento principale dovrebbe essere la documentazione, non lo stack overflow. Grazie ancora per la risposta. –

+1

La risposta sopra è corretta! Ma non è necessario estendere l'ascoltatore. Basta chiamare il tabLayout.setupWithViewPager (mViewPager) prima che tabLayout.setOnTabSelectedListener risolva questo problema. –

1

Ecco un esempio un po 'più piena con tre schede. Utilizza il più recente addOnTabSelectedListener anziché 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()); 
    } 
}); 

Note:

  • onTabSelected e onTabUnselected sono chiamati ogni volta che c'è un cambiamento in schede.
  • onTabReselected viene chiamato ogni volta che si fa nuovamente clic su una scheda mentre è già visualizzata.