2015-06-17 19 views
36

我剛纔遷移我的老ActionBarTabLayout(支持材料設計)。onTabSelected選擇了不叫

一切都很好,但我不能攔截選項卡中選擇 方法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.setOnTabSelectedListener解決此問題之前調用tabLayout.setupWithViewPager(mViewPager)。 –

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

注:

  • onTabSelectedonTabUnselected被稱爲每次有在標籤的變化的時間。
  • onTabReselected被調用,無論何時一個標籤再次被點擊,而它已經顯示。