Fragment非常实用,Android也为3.0以前的平台增加了Fragment支持,只是该Fragment不是继承android.app.Fragment,而是继承android.support.v4.app.Fragment。
除此之外,Android还为该android.v4.app.Fragment提供了如下配套类。
- FragmentActivity:在早期版本上使用Fragment必须借助于FragmenActivity的支持,只有该支持类提供的getSupportFragmentManager()方法才能获取FragmentManager管理器。
- ViewPager:它是Fragment容器,可以同时管理多个Fragment,并允许多个Fragment切换时提供动画效果。
- FragmentPagerAdapter:Adpter类,用于为ViewPager提供多个Fragment。通常用于被扩展。
提示:FragmentPagerAdapter的作用有点类似于前面介绍的Adpter,只是Adapter用于为AdapterView提供多个列表项;而FragmentPagerAdapter则专门为ViewPager提供多个Fragment。
- PagerTitleStrip:与ViewPager结合使用,用于在ViewPager上显示“导航条”。
该实例的界面布局文件将会使用ViewPager容器,该容器可以盛装多个Fragment,并为多个Fragment切换时提供动画支持。该实例的界面布局文件如下。
<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组件创建并设置FragmentPagerAdpter。
下面是该Activity的代码。
package org.crazyit.helloworld; import android.os.Bundle; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.ActionBar.TabListener; import android.app.Activity; import android.app.FragmentTransaction; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.Menu; public class ActionBar_TabSwipeNav extends FragmentActivity implements TabListener { ViewPager viewPager; ActionBar actionBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.action_bar__tab_swipe_nav); //获取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 DummyFragmentOther(); Bundle args=new Bundle(); args.putInt(DummyFragment.ARG_SECTION_NUMBER, position+1); fragment.setArguments(args); // TODO Auto-generated method stub return fragment; } //该方法的返回值i表明该Adapter总共包括多少个Fragmnet @Override public int getCount() { // TODO Auto-generated method stub return 3; } @Override public CharSequence getPageTitle(int position) { switch(position) { case 0: return "第一页"; case 1: return "第二页"; case 2: return "第三页"; } // TODO Auto-generated method stub //return super.getPageTitle(position); 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显示的Fragmnet发生改变时激发该方法 @Override public void onPageSelected(int position) { // TODO Auto-generated method stub //super.onPageSelected(position); actionBar.setSelectedNavigationItem(position); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.action_bar__tab_swipe_nav, menu); return true; } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub viewPager.setCurrentItem(tab.getPosition());//② } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } }
上面的程序采用匿名内部类的形式创建了一个FragmentPagerAdapter对象。接下来程序在①号代码处为ViewPager组件设置了该FragmentPagerAdpter对象,这样即可让该ViewPager正常工作。
为了启用ActionBar的Tab导航支持,上面的粗体字代码同样遵守前面介绍的两个步骤:先调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)启用Tab导航支持,再调用ActionBar的addTab()方法添加Tab标签,并为Tab标签绑定事件监听器。
由于此处使用了ViewPager来管理多个Fragment,程序代码处理Fragment的切换时更简单:只要调用ViewPager的setCurrentItem()方法来显示指定Fragment即可。如上面程序中②号代码所示。
运行上面的程序将会看到如下效果图: