一、相关概念
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上显示“导航条”。
二、实例
接下来Activity中还是需要按照上面介绍的两个步骤来启用ActionBar的Tab导航支持。除此之外,为了让ViewPager组件能正常工作,Activity需要为该ViewPager组件创建并设置FragmentPagerAdapter。
只要调用ActionBar的setSelectedNavigationItem()方法就可以切换ActionBar。如上程序中的①号代码所示。
只要调用ViewPager的setCurrentItem()方法来显示指定Fragment即可。如上程序中的②号代码所示。
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>
接下来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即可。如上程序中的②号代码所示。