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即可。如上面程序中②号代码所示。

运行上面的程序将会看到如下效果图:

Android3.0 以前的Fragment支持的更多相关文章

  1. Android3.0中ActionBar的新特性

    1. ActionBar(活动栏)替代了显示在屏幕顶端的标题栏.主要负责显示菜单,widget,导航等功能,主要包括:@  显示选项菜单中的菜单项到活动栏:@  添加可交互的视图到活动栏作为活动视图: ...

  2. 启用Servlet 3.0新特性——注解支持

    Servlet 3.0版本新增注解支持,可是在实际使用中,添加的注解总是不起作用.经过检查,原来是“web.xml”文件的顶级标签“<web-app/>”中的一个叫做“metadata-c ...

  3. android圆角View实现及不同版本这间的兼容(android3.0过后的版本)

    http://blog.csdn.net/lovecluo/article/details/8710174 在做我们自己的APP的时候,为了让APP看起来更加的好看,我们就需要将我们的自己的View做 ...

  4. 解决android3.0版本号以上应用接收不到开机广播问题

    如今是2014-07-16 下午15:27. 好久没写过东西,突然间灵感喷发想写点东西(事实上是刚刚弄好了一个棘手的问题,自豪中..呵呵呵呵 我牛掰).废话不多说,进入正题. 不知道你们又没有碰到这问 ...

  5. appcompat v21: 让 Android 5.0 前的设备支持 Material Design

    1. 十大Material Design开源项目 2. appcompat v21: 让 Android 5.0 前的设备支持 Material Design 主题 AppCompat已经支持最新的调 ...

  6. Apache Spark 3.0 将内置支持 GPU 调度

    如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU.FPGA 或 TPU 来加速计算.在 Apache Hadoop 3.1 版本里面 ...

  7. Servlet 3.0对上传的支持

    Servlet 2.5 进行上传   首先对表单的要求     ->method ="post"    ->enctype="multipart/form-d ...

  8. 如何让ie9.0以下的浏览器支持getElementsByClassName

    如何让ie9.0以下的浏览器支持getElementsByClassName     /** * node是表示dom树的搜索起点,Classname是需要搜索的类名. * 如果传入的节点上已经存在了 ...

  9. SpringMVC 全注解实现 (1) servlet3.0以上的容器支持

    一. Spring MVC入门 1.1 request的处理过程 用户每次点击浏览器界面的一个按钮,都发出一个web请求(request).一个web请求的工作就像一个快递员,负责将信息从一个地方运送 ...

随机推荐

  1. RPC远程过程调用机制底层原理

  2. JS学习随手笔记

    ===================字符串===================== 字符串中间的空格也是要算长度的. 每一个字符都可以返回对应的Unicode 编码 文字的简单加密都是通过char ...

  3. python数组查找算法---bisect二分查找插入

    1 实例 这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块 [python] view plaincopyprint? import bisect L = [1,3,3,6,8, ...

  4. java 读excel xlsx

    http://bbs.csdn.net/topics/380257685 import java.io.File; import java.io.IOException; import java.io ...

  5. Zipf’s Law

    Let f(w) be the frequency of a word w in free text. Suppose that all the words of a text are ranked ...

  6. SSL 双向认证

    利用OpenSSL生成库和命令程序,在生成的命令程序中包括对加/解密算法的测试,openssl程序,ca程序.利用openssl,ca可生成用于C/S模式的证书文件以及CA文件.下面以C/S模式说明证 ...

  7. USB自定义HID设备实现-STM32

    该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在 #include "usb_desc.h& ...

  8. for/foreach/linq效率测试

    ; Random r = new Random(); List<byte> list = new List<byte>(); Console.WriteLine("开 ...

  9. FATFS外置UNICODE GBK双向转换码表(转)

    源:FATFS外置UNICODE GBK双向转换码表 将UtoG,GtoU双向码表放到存储卡里面实现长文件名,因为FATFS长文件名需要unicode支持, 首先将UtoG.sys,GtoU.sys两 ...

  10. UIAlertController高级之嵌入其他控件

    在编码过程中,我们经常遇到需要这样一个效果,就是弹出框的嵌套; 举个最简单的例子,比如你要选择时间,必然需要一个时间选择器DatePicker.但是这个选择器又是在你点击某按钮时弹出,弹出方式最常见的 ...