Android3.0以前的Fragment支持(ViewPager)

一、相關概念
Fragment非常實用,Android也爲3.0以前的平臺增加了Fragment支持,只是該Fragment不是繼承android.app.Fragment,而是繼承android.support.v4.app.Fragment。


除此之外,Android還爲該android.support.v4.app.Fragment提供瞭如下配套類。
FragmentActivity:在早期版本上使用Fragment必須藉助於FragmentActivity的支持,只有該支持類提供的getSupportFragmentManager()方法才能獲取FragmentManager管理器。
ViewPager:它是Fragment容器,可以同時管理多個Fragment,並允許多個Fragment切換時提供動畫效果。
FragmentPagerAdapter:Adapter類,用於爲ViewPager提供多個Fragment。通常用於被擴展。
PagerTitleStrip:與ViewPager結合使用,用於在ViewPager上顯示“導航條”。


二、實例

main.xml

<android.support.v4.view.ViewPager
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/pager"
	android:layout_width="match_parent"
	android:layout_height="match_parent">
	<!-- 定義導航狀態條組件 -->
	<android.support.v4.view.PagerTitleStrip 
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:layout_gravity="top"
		android:background="#33b5e5"
		android:textColor="#fff"
		android:paddingTop="4dp"
		android:paddingBottom="4dp" />	
</android.support.v4.view.ViewPager>


上面的佈局文件中定義了一個ViewPager組件,併爲該ViewPager組件定義了配套的PagerTitleStrip組件——它是一個導航狀態條組件。
接下來Activity中還是需要按照上面介紹的兩個步驟來啓用ActionBar的Tab導航支持。除此之外,爲了讓ViewPager組件能正常工作,Activity需要爲該ViewPager組件創建並設置FragmentPagerAdapter。


ActionBar_TabSwipeNav.java

public class ActionBar_TabSwipeNav extends FragmentActivity
	implements ActionBar.TabListener
{
	ViewPager viewPager;
	ActionBar actionBar;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 獲取ActionBar對象
		actionBar = getActionBar();
		// 獲取ViewPager
		viewPager = (ViewPager) findViewById(R.id.pager);
		// 創建一個FragmentPagerAdapter對象,該對象負責爲ViewPager提供多個Fragment
		FragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(
				getSupportFragmentManager())
		{
			// 獲取第position位置的Fragment
			@Override
			public Fragment getItem(int position)
			{
				Fragment fragment = new DummyFragment();
				Bundle args = new Bundle();
				args.putInt(DummyFragment.ARG_SECTION_NUMBER, position + 1);
				fragment.setArguments(args);
				return fragment;
			}
			// 該方法的返回值i表明該Adapter總共包括多少個Fragment
			@Override
			public int getCount()
			{
				return 3;
			}
			// 該方法的返回值決定每個Fragment的標題
			@Override
			public CharSequence getPageTitle(int position)
			{
				switch (position)
				{
					case 0:
						return "第一頁";
					case 1:
						return "第二頁";
					case 2:
						return "第三頁";
				}
				return null;
			}
		};
		// 設置ActionBar使用Tab導航方式
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		// 遍歷pagerAdapter對象所包含的全部Fragment。
		// 每個Fragment對應創建一個Tab標籤
		for (int i = 0; i < pagerAdapter.getCount(); i++)
		{
			actionBar.addTab(actionBar.newTab()
				.setText(pagerAdapter.getPageTitle(i))
				.setTabListener(this));
		}
		// 爲ViewPager組件設置FragmentPagerAdapter
		viewPager.setAdapter(pagerAdapter); 
		// 爲ViewPager組件綁定事件監聽器
		viewPager.setOnPageChangeListener(
			new ViewPager.SimpleOnPageChangeListener()
			{
				// 當ViewPager顯示的Fragment發生改變時激發該方法
				@Override
				public void onPageSelected(int position)
				{
					actionBar.setSelectedNavigationItem(position); //①
				}
			});
	}

	@Override
	public void onTabUnselected(ActionBar.Tab tab,
			FragmentTransaction fragmentTransaction)
	{
	}

	// 當指定Tab被選中時激發該方法
	@Override
	public void onTabSelected(ActionBar.Tab tab,
			FragmentTransaction fragmentTransaction)
	{
		viewPager.setCurrentItem(tab.getPosition());  //②
	}

	@Override
	public void onTabReselected(ActionBar.Tab tab,
			FragmentTransaction fragmentTransaction)
	{
	}
}
由於此處使用了ActionBar,並且使用了ViewPager來管理多個Fragment,程序代碼處理Fragment的切換時更加簡單:
只要調用ActionBar的setSelectedNavigationItem()方法就可以切換ActionBar。如上程序中的①號代碼所示。
只要調用ViewPager的setCurrentItem()方法來顯示指定Fragment即可。如上程序中的②號代碼所示。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章