在Android中使用ViewPager实现左右滑动页面

在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;
}

TabState中封装要实现的界面个数,默认打开的界面position,以及个界面对应的position。

在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,实现页面之间的切换。

在这需要设置ActionBar导航模式为NAVIGATION_MODE_TABS

mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

添加Tab:setupTabs() -> addTab(int expectedTabIndex, int icon, int description)

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");
    }
}


添加Tabs点击事件,需要实现TabListener接口中的onTabReselected, onTabSelected, onTabUnselected方法。

这里我在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
    }

}

以及监听左右滑动事件,实现OnPageChangeListener接口中的onPageScrollStateChanged,onPageScrolled,onPageSelected方法。

这里我在onPageSelected中实现点击后切换到对应页面的代码:

@Override
public void onPageSelected(int position) {
    // TODO Auto-generated method stub
    setCurrentTab(position, false);
    Log.d(TAG, "onPageSelected position:" + position);
}

至此:可以在每个Fragment中添加对应的内容,实现不同的功能。






你可能感兴趣的:(android,viewpager,Fragment,Actionbar)