Android 未调用已选择的未调用
我刚刚将旧的Android 未调用已选择的未调用,android,tabs,Android,Tabs,我刚刚将旧的ActionBar迁移到新的TabLayout(支持材料设计) 一切都很好,但我无法拦截选项卡选择 只有在第一次显示TabLayout时才会调用方法onTabSelected,但单击选项卡时,不会发生任何事情! 知道这个代码有什么问题吗 tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); mViewPager = (View
ActionBar
迁移到新的TabLayout
(支持材料设计)
一切都很好,但我无法拦截选项卡选择
只有在第一次显示TabLayout
时才会调用方法onTabSelected
,但单击选项卡时,不会发生任何事情!
知道这个代码有什么问题吗
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(新的ViewPagerOnTabSelectedListener(viewPager))代码>,覆盖您的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()
,并在setupWithViewPager()之后调用setOnTabSelectedListener()
:
下面是一个更完整的示例,有三个选项卡。它使用较新的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
在选项卡已显示时,只要再次单击该选项卡,就会调用该选项卡
你说得对,这为我解决了一个类似的错误。但是,TabLayout.ontAbsSelectedListener的文档中没有提到这一事实。您的答案应该放在android官方文档中。我的主要引用应该是文档,而不是堆栈溢出。再次感谢您的回答。以上答案是正确的!但是没有必要扩展侦听器。在tabLayout.setOnAbsSelectedListener解决此问题之前,只需调用tabLayout.setupWithViewPager(mViewPager)。@FaizanAbidNaqvi-如果希望在ontAbsSelected()中自定义行为,您仍然需要扩展tabLayout.viewPageronAbsSelectedListener
但仍然希望选项卡选择事件更改所选页面。我以前使用过这个TabLayout.OnTabSelectedListener
,在onTabSelected()
内执行viewpager.setCurrentItem
,甚至不知道这个TabLayout.ViewPagerOnTabSelectedListener
存在。谢谢