onTabSelected 选中未调用
onTabSelected Selected Not Called
我刚刚将旧 ActionBar
迁移到新 TabLayout
(支持 Material 设计)。
一切都很好,但我无法拦截选项卡选择
方法onTabSelected
只在第一次显示TabLayout
时被调用,但是点击tabs时,没有任何反应!
知道这段代码有什么问题吗?
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);
当您调用 setupWithViewPager
时,这将在内部调用 setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
,覆盖您的 OnTabSelectedListener
。
相反,您的侦听器应扩展 TabLayout.ViewPagerOnTabSelectedListener,然后覆盖 onTabSelected()
并在 setupWithViewPager()
:
之后调用 setOnTabSelectedListener()
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();
}
});
这是一个更完整的示例,其中包含三个选项卡。它使用较新的 <strong>add</strong>OnTabSelectedListener
而不是 <strong>set</strong>OnTabSelectedListener
.
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
每当再次单击已显示的选项卡时调用。
我刚刚将旧 ActionBar
迁移到新 TabLayout
(支持 Material 设计)。
一切都很好,但我无法拦截选项卡选择
方法onTabSelected
只在第一次显示TabLayout
时被调用,但是点击tabs时,没有任何反应!
知道这段代码有什么问题吗?
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);
当您调用 setupWithViewPager
时,这将在内部调用 setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
,覆盖您的 OnTabSelectedListener
。
相反,您的侦听器应扩展 TabLayout.ViewPagerOnTabSelectedListener,然后覆盖 onTabSelected()
并在 setupWithViewPager()
:
setOnTabSelectedListener()
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();
}
});
这是一个更完整的示例,其中包含三个选项卡。它使用较新的 <strong>add</strong>OnTabSelectedListener
而不是 <strong>set</strong>OnTabSelectedListener
.
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
每当再次单击已显示的选项卡时调用。