首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 同時支援 ActionBar Tab 與 ViewPager 的 Fragment 適配器設計

     編輯:程式設計綜合問答

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

優點

  • 單一適配器管理 Tab 與 ViewPager 同步。
  • 支援動態增減 Tab。
  • 相容舊版 ActionBar 與新版 Toolbar。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved