讓 FragmentPagerAdapter 同時實作 ActionBar.TabListener 與 ViewPager.OnPageChangeListener,統一切換邏輯,支援手機/平板雙模式。
public class TabsPagerAdapter extends FragmentPagerAdapter
implements ViewPager.OnPageChangeListener, ActionBar.TabListener {
private final ActionBar actionBar;
private final ViewPager viewPager;
private final List tabs = new ArrayList<>();
public TabsPagerAdapter(FragmentManager fm, ActionBar actionBar, ViewPager viewPager) {
super(fm);
this.actionBar = actionBar;
this.viewPager = viewPager;
viewPager.setAdapter(this);
viewPager.addOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
tabs.add(info);
actionBar.addTab(tab);
notifyDataSetChanged();
}
@Override public Fragment getItem(int position) {
TabInfo info = tabs.get(position);
return Fragment.instantiate(viewPager.getContext(), info.clss.getName(), info.args);
}
@Override public int getCount() { return tabs.size(); }
// TabListener
@Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {}
@Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {}
// OnPageChangeListener
@Override public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
@Override public void onPageScrolled(int p, float v, int o) {}
@Override public void onPageScrollStateChanged(int s) {}
static class TabInfo { Class> clss; Bundle args; TabInfo(Class> c, Bundle a){clss=c;args=a;} }
}
ViewPager vp = findViewById(R.id.pager);
TabsPagerAdapter adapter = new TabsPagerAdapter(getSupportFragmentManager(), getSupportActionBar(), vp);
adapter.addTab(actionBar.newTab().setText("Tab1"), Fragment1.class, null);
adapter.addTab(actionBar.newTab().setText("Tab2"), Fragment2.class, null);
ActionBar 與新版 Toolbar。