使用Fragment填充ViewPager
在上一篇文章中,讲解了使用PagerAdapter作为适配器时的ViewPager的使用方法。然后在实际项目中更多的使用Fragment作为页卡,因为实际开发中每一个页卡要复杂的多。而使用Fragment有利于切断每一个页卡与MainActivity的联系,在各自的Fragment上实现自己更复杂的功能。其实使用Fragment作为填充,大部分的代码都与使用View作为填充类似,如果你还不知道怎么使用View来作为页卡,可以点击下面的链接,进行阅读学习:
http://www.cnblogs.com/fuly550871915/p/4922953.html
下面我们以一个完整的例子,来讲一下使用FragmenStatePagerAdapter作为适配器,ViewPager使用方法。由于大部分的知识都在上一篇文章(使用View作为填充ViewPager)中讲过,因此具体的代码解释就不再进行了。
新建项目,然后新建布局,作为Fragment的填充物。首先是layout1.xml。如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是第一个界面"
android:textSize="30sp"/> </LinearLayout>
代码很简单,不解释。然后再建立同样的三个布局,分别命名为layout2.xml,layout3.xml,layout4.xml。唯一不同的就是第10行文本的显示不同而已。具体代码同上,就不贴出来了。然后就可以建立Fragment类了。
新建类Fragment1,继承自Fragment。其中的代码如下:
package com.example.viewpager; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class Fragment1 extends Fragment{ public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { return inflater.inflate(R.layout.layout1, null);
}
}
从代码中发现,将layout1这个布局加载给了Fragment1.同样的道理,新建Fragment2,Fragment3,Fragment4,分别用来加载layout2,layout3,layout4.
就这样子,所有的Fragment都准备好了。下面开始写适配器,就采用FragmentStatePagerAdapter吧。代码如下:
package com.example.viewpager; import java.util.List; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup; /**
* ViewPager的适配器
* @author fuly1314
*
*/
public class FragmentAdapter extends FragmentStatePagerAdapter{ private List<Fragment> fragmentList;//数据源
private List<String> titles;//标题 public FragmentAdapter(FragmentManager fm,List<Fragment> fragmentList,List<String> titles) {
21 super(fm);
22 this.fragmentList = fragmentList;
23 this.titles = titles;
24 } //相应页卡设定相应的Fragment
public Fragment getItem(int arg0) { return fragmentList.get(arg0);
} //数据源的数目
public int getCount() { return fragmentList.size();
} /*
* 对于FragmentStatePagerAdapter,它的销毁和实例方法,即
* destroyItem和instantiateItem方法保持默认即可
*/
public void destroyItem(ViewGroup container, int position, Object object) {
43
44 super.destroyItem(container, position, object);
45 }
46
47 public Object instantiateItem(ViewGroup arg0, int arg1) {
48
49 return super.instantiateItem(arg0, arg1);
50 }
51
52 //设定标题
53 public CharSequence getPageTitle(int position) {
54
55 return titles.get(position);
56 } }
注意的红色的代码。应该注意的是,FragmentStatePagerAdapter的销毁item和显示item的方法都保持默认的写法即可。
然后就是MainActivity中的代码了,如下:
package com.example.viewpager; import java.util.ArrayList;
import java.util.List; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.widget.Toast;
import android.graphics.Color; public class MainActivity extends FragmentActivity implements OnPageChangeListener{ private ViewPager pager;
private List<Fragment> fragmentList = new ArrayList<Fragment>();//数据源
private FragmentAdapter fragmentAdapter; private List<String> titles = new ArrayList<String>();//标题 private PagerTabStrip pagerTitle;//ViewPager的标题 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //获取ViewPager
pager = (ViewPager) findViewById(R.id.view_pager); pager.setOnPageChangeListener(this);//设置监听器 //获取pagerTitle
pagerTitle = (PagerTabStrip) findViewById(R.id.pager_title); //为标题设置属性,比如背景,颜色线等
pagerTitle.setBackgroundColor(Color.RED);//设置背景颜色
pagerTitle.setTextColor(Color.YELLOW);//设置标题文字的颜色
pagerTitle.setDrawFullUnderline(false);//将标题下的长分割线去掉
pagerTitle.setTabIndicatorColor(Color.BLUE);//设置标题下粗一点的短分割线的颜色 //添加标题
titles.add("第一页");
titles.add("第二页");
titles.add("第三页");
titles.add("第四页"); //获取四个Fragment
Fragment1 fragment1 = new Fragment1();
Fragment2 fragment2 = new Fragment2();
Fragment3 fragment3 = new Fragment3();
Fragment4 fragment4 = new Fragment4(); //将四个Fragment加入到集合
fragmentList.add(fragment1);
fragmentList.add(fragment2);
fragmentList.add(fragment3);
fragmentList.add(fragment4); //实例化适配器
fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(),fragmentList,titles); //设置适配器
pager.setAdapter(fragmentAdapter);
} //当滚动状态改变时被调用
public void onPageScrollStateChanged(int arg0) { } //滚动时调用
public void onPageScrolled(int arg0, float arg1, int arg2) { } //当页卡被选中时调用
public void onPageSelected(int arg0) { Toast.makeText(this, "这是第"+(arg0+1)+"个界面", Toast.LENGTH_LONG).show(); } }
注意红色的代码,此时继承的是FragmentActivity。而且所有导入的包,都应该是android.support.v4下的。
好了,现在都写好了,运行程序即可,效果图如下:

总结:
如果用Fragment作为页卡,需要注意:
(1)活动继承的是FragmentActivity,而不是Activity。
(2)相关的导包都应该是android.support.v4下的包。
(3)对于FragmentStatePagerAdapter,它的destroyItem和instantiateItem方法保持默认即可,不用编写。
使用Fragment填充ViewPager的更多相关文章
- Android流行界面结构——Fragment通过ViewPager(带指示器)嵌套Fragment结构的创建方法详解
原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6287213.html 当前Android流行界面结构的一种——Fragment通过ViewPage ...
- Fragment与ViewPager
众所周知,为了实现滑动界面,经常让Fragment与ViewPager一起结合使用,每一个ViewPager的页面就是一个Fragment,我们可以在fragment中实现丰富的功能.它的基本用法可以 ...
- Android之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面
感觉 Android 到处都是坑,每个地方都要把人折腾半天. 今天来简单说说 Android之ActionBar.Tabs.Fragment.ViewPager 实现标签页切换并缓存页面 关于他们的介 ...
- Android Tab类型主界面 Fragment+TabPageIndicator+ViewPager
文章地址: Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager 1.使用ViewPager + PagerAdapter 每个页面的内容都 ...
- 使用View填充ViewPager
ViewPager在app开发中十分常见.今天以一个例子详细解读下ViewPager的基础知识. 一.什么是ViewPager 可以这样理解,ViewPager就相当于一个容器,它的里面可以装view ...
- Android中Fragment和ViewPager那点事儿(仿微信APP)
在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...
- android fragment+ FragmentTabHost+viewpager 切换状态不保存的问题
转载请注明出处:http://blog.csdn.net/djy1992/article/details/46674169 @author dujinyang 难得有时间上来写博客. fragment ...
- 【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析
ViewPager中切换界面Fragment被销毁的问题分析 1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3 2.Fragment生命周期以及与Activ ...
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24740977 Android如今实现Tab类型的界面方式越来越多,今天就把常见的 ...
随机推荐
- 【STL】count_if
功能 返回满足条件的元素个数 模版 template <class InputIterator, class Predicate> typename iterator_traits< ...
- Redis学习笔记--常用命令
以下为本人学习Redis的备忘录,记录了大部分常用命令 1.客户端连接redis服务端: ===启动Redis服务端 redis-server /yourpath/redis.conf ===启动Re ...
- touch-slide-image
用htmls5+css3实现的在android和ios,以及wekit新版浏览器上实现手指滑动切换图片. https://github.com/navyxie/touch-slide-image
- Codeforces 494E. Sharti
Description 有一个 \(n*n\) 的矩形,给出 \(m\) 个子矩形,这些矩形内部的点都是白色的,其余的点都是黑色,每一次你可以选择一个变长不超过 \(k\) 的正方形,满足这个正方形的 ...
- entity framework 查看自动生成的sql
public MesDbContext() : base("name=mysql") { Database.Log = new Action<string>(msg = ...
- 如何高效的算出2x8的值
原文出自:https://blog.csdn.net/seesun2012 位移算法,如何高效的算出2*8的值,为什么8<<1,4<<2,2<<3,1<< ...
- 8、导航:Nav
1.导航视图 angular2 中的是视图是显示在<router-outlet></router-outlet>里的同时他要依赖于 directives:[ ROUTER_ ...
- Hadoop实战之三~ Hello World
本文介绍的是在Ubuntu下安装用三台PC安装完成Hadoop集群并运行好第一个Hello World的过程,软硬件信息如下: Ubuntu:12.04 LTS Master: 1.5G RAM,奔腾 ...
- linux系统下部署项目
一.修改防火墙设置,开放对应的端口 修改Linux系统防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,如果要开放哪个端口,在里面添加一条 -A RH-Firewall- ...
- MVC4.0 oracle 找不到请求的 .Net Framework Data Provider。可能没有安装.
oracle 11G, MVC4.0 项目,因刚重装系统,重新安装的VS2010, ORACLE 11G 运行项目,后报错 找不到请求的 .Net Framework Data Provider.可能 ...