在Android中可以使用ViewPager实现左右滑动页面。 例如原生联系人应用中的收藏联系人、联系人主页面以及群组页面之间的滑动,还有像UC浏览器等应用在安装之后的引导页面。 通过学习源码,实现了一个简单的demo: 主要文件有: ViewPagerActivity的布局文件: view_pager_demo.xml: ViewPager中三个滑动界面的布局文件: default_browser_list_fragment.xml: left_browser_list_fragment.xml: right_browser_list_fragment.xml: 以及对应的类文件: DefaultBrowserListFragment.java: LeftBrowserListFragment.java: RightBrowserListFragment.java: 接下来主要讲讲ViewPagerActivity加载这三个Fragment以及左右滑动的具体实现: public interface TabState { public static int LEFT = 0; public static int ALL = 1; public static int RIGHT = 2; public static int COUNT = 3; public static int DEFAULT = ALL; }
在ActionBar.java源码中
public static final int NAVIGATION_MODE_STANDARD = 0; //Standard模式:在ActionBar中可以添加:logo/icon、标题信息、副标题、和一些Menu元素。 public static final int NAVIGATION_MODE_LIST = 0; //List模式:代替静态的标题,可以添加一些下拉的菜单。 public static final int NAVIGATION_MODE_TABS = 0; //Tab模式:可以在Activity中添加一些Tab,实现页面之间的切换。
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
private void addTab(int expectedTabIndex, int icon, int description) { final Tab tab = mActionBar.newTab(); tab.setTabListener(mTabListener);//添加tab点击事件 //mShowTabsAsText用于控制在Tab中显示文字还是显示图标及描述文字 if (mShowTabsAsText) { tab.setText(description); } else { tab.setIcon(icon); tab.setContentDescription(description); } mActionBar.addTab(tab); //如果不是TabState中封装的TabIndex则抛出异常 if (expectedTabIndex != tab.getPosition()) { throw new IllegalStateException("Tabs must be created in the right order"); } }
这里我在onTabSelected中实现点击后切换到对应页面的代码。
@Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub if (!mIgnoreTabSelected) { setCurrentTab(tab.getPosition()); Log.d(TAG, "onTabSelected position:" + tab.getPosition()); } }
private void setCurrentTab(int tab, boolean notifyUpdateFragments) { mCurrentTab = tab; final int actionBarSelectedNavIndex = mActionBar.getSelectedNavigationIndex(); if (mCurrentTab != actionBarSelectedNavIndex) { mActionBar.setSelectedNavigationItem(mCurrentTab); mTabListener.mIgnoreTabSelected = false; } if (notifyUpdateFragments) updateFragmentsVisibility(); }
接下来就是实现每个页面,添加Fragment的代码以及添加完Fragment后更新Fragment的显示状态:
mTabPager = (ViewPager) findViewById(R.id.tab_pager); mTabPagerAdapter = new TabPagerAdapter(); mTabPager.setAdapter(mTabPagerAdapter); mTabPager.setOnPageChangeListener(mTabPagerListener); mDefaultBrowserListFragment = (DefaultBrowserListFragment) fragmentManager.findFragmentByTag(DEFAULT_TAG); mLeftBrowserListFragment = (LeftBrowserListFragment) fragmentManager.findFragmentByTag(LEFT_TAG); mRightBrowserListFragment = (RightBrowserListFragment) fragmentManager.findFragmentByTag(RIGHT_TAG); if (mDefaultBrowserListFragment == null) { mDefaultBrowserListFragment = new DefaultBrowserListFragment(); mLeftBrowserListFragment = new LeftBrowserListFragment(); mRightBrowserListFragment = new RightBrowserListFragment(); fragmentTransaction.add(R.id.tab_pager, mLeftBrowserListFragment, LEFT_TAG); fragmentTransaction.add(R.id.tab_pager, mDefaultBrowserListFragment, DEFAULT_TAG); fragmentTransaction.add(R.id.tab_pager, mRightBrowserListFragment, RIGHT_TAG); } fragmentTransaction.hide(mDefaultBrowserListFragment); fragmentTransaction.hide(mLeftBrowserListFragment); fragmentTransaction.hide(mRightBrowserListFragment); fragmentTransaction.commitAllowingStateLoss(); fragmentManager.executePendingTransactions(); updateFragmentsVisibility();
在ViewPager中添加Fragment需要实现PagerAdapter:
public class TabPagerAdapter extends PagerAdapter { private FragmentManager mFragmentManager; private FragmentTransaction mCurTransaction = null; public TabPagerAdapter() { mFragmentManager = getFragmentManager(); } @Override public int getCount() { // TODO Auto-generated method stub return TabState.COUNT; } @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return POSITION_NONE; } private Fragment getFragment(int position) {} @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub return null; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub } @Override public void finishUpdate(ViewGroup container) { // TODO Auto-generated method stub } @Override public boolean isViewFromObject(View view, Object object) { // TODO Auto-generated method stub } }
这里我在onPageSelected中实现点击后切换到对应页面的代码:
@Override public void onPageSelected(int position) { // TODO Auto-generated method stub setCurrentTab(position, false); Log.d(TAG, "onPageSelected position:" + position); }
至此:可以在每个Fragment中添加对应的内容,实现不同的功能。