如何使用viewpager与fragment加viewpager写一个app导航activity

| 漏洞检测 |
| 隐藏捆绑 |
Android ViewPager和Fragment实现顶部导航界面滑动效果(2)
5Fragment适配器FragmentAdapter,继承于FragmentPagerAdapter package com.example.import java.util.ArrayLimport java.util.Limport android.support.v4.app.Fimport android.sup
5&Fragment适配器FragmentAdapter,继承于FragmentPagerAdapter
package com.example.
import java.util.ArrayL
import java.util.L
import android.support.v4.app.F
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentPagerA
public class FragmentAdapter extends FragmentPagerAdapter {
List fragmentList = new ArrayList();
public FragmentAdapter(FragmentManager fm,List fragmentList) {
super(fm);
this.fragmentList = fragmentL
public Fragment getItem(int position) {
return fragmentList.get(position);
public int getCount() {
return fragmentList.size();
6&Fragment显示函数ChatFragment.java,ContactsFragment.java,FriendFragment.java(只给出一个,其他类似)
package com.example.
import android.os.B
import android.support.v4.app.F
import android.view.LayoutI
import android.view.V
import android.view.ViewG
public class ChatFragment extends Fragment {
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
View chatView = inflater.inflate(R.layout.activity_tab_chat, container,false);
return chatV
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
(责任编辑:幽灵学院)
------分隔线----------------------------
场长挪用千万公款赴(澳门赌博网站) 坚信小赌怡情,大赌伤身 中国江西网讯 王倩、记...
最近携程开源了一套动态加载的框架,总的来说,该框架和OpenAtlas还是有一定的相似之...
apktool 反编译APK 使用apktool d ,默认会生成和APK文件名同名的文件夹,里面会存放反...
话说一个乞丐在看一个程序员写程序,程序员遇到一个问题怎么都解决不了,这时乞丐说这...
本节引言: 最近一段时间因为工作上的事以及面试等等,耽误了博客的更新,这里道歉下~...
美团的下拉刷新分为三个状态: 第一个状态为下拉刷新状态(pull to refresh),在这个状...
admin@1744.cc
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院
广告服务:QQ:Android实习札记(5)---Fragment之底部导航栏的实现
在Part 4我们回顾了一下Fragment的基本概念,在本节中我们就来学习Fragment应用的简单例子吧!
就是使用Fragment来实现简单的底部导航栏,先贴下效果图:
看上去很简单,实现起来也是很简单的哈!那么接着下来就看下实现的流程图吧:
实现流程图:
看完流程图是不是有大概的思路了,那么接着就开始代码的编写吧:
①先写布局,布局的话很简单,一个FrameLayout用来放Fragment,底部一个大的LinearLayout
放着三个小Item,每个Item的布局如下:
copy多两个,改下图片,文本资源就可以了,完整布局代码如下:
activity_main.xml
&framelayout android:id="@+id/content" android:layout_height="0dp" android:layout_weight="1" android:layout_width="match_parent"&
&/framelayout&
②接着就写三个Fragment的布局,这个看你需要了,这里就一个TextView
写完一式三份,复制多两个,改下颜色和文字
③接着写三个Fragment的实现类,同样一式三份,改下inflate加载的Fragment即可
Fragment1.java
package com.jay.example.
import android.os.B
import android.support.v4.app.F
import android.view.LayoutI
import android.view.V
import android.view.ViewG
public class Fragment1 extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fg1, container,false);
④接着就到MainActivity的编写了,也很简单,自己看看吧,就不多解释了
就定义的几个方法,初始化选项,选中处理,以及隐藏所有Fragment的方法!
MainActivity.java
package com.jay.example.
import android.os.B
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentT
import android.view.V
import android.view.View.OnClickL
import android.widget.FrameL
import android.widget.ImageV
import android.widget.RelativeL
import android.widget.TextV
public class MainActivity extends FragmentActivity implements OnClickListener{
//定义3个Fragment的对象
private Fragment1 fg1;
private Fragment2 fg2;
private Fragment3 fg3;
//帧布局对象,就是用来存放Fragment的容器
private FrameL
//定义底部导航栏的三个布局
private RelativeLayout course_
private RelativeLayout found_
private RelativeLayout settings_
//定义底部导航栏中的ImageView与TextView
private ImageView course_
private ImageView found_
private ImageView settings_
private TextView course_
private TextView settings_
private TextView found_
//定义要用的颜色值
private int whirt = 0xFFFFFFFF;
private int gray = 0xFF7597B3;
private int blue =0xFF0AB2FB;
//定义FragmentManager对象
FragmentManager fM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fManager = getSupportFragmentManager();
initViews();
//完成组件的初始化
public void initViews()
course_image = (ImageView) findViewById(R.id.course_image);
found_image = (ImageView) findViewById(R.id.found_image);
settings_image = (ImageView) findViewById(R.id.setting_image);
course_text = (TextView) findViewById(R.id.course_text);
found_text = (TextView) findViewById(R.id.found_text);
settings_text = (TextView) findViewById(R.id.setting_text);
course_layout = (RelativeLayout) findViewById(R.id.course_layout);
found_layout = (RelativeLayout) findViewById(R.id.found_layout);
settings_layout = (RelativeLayout) findViewById(R.id.setting_layout);
course_layout.setOnClickListener(this);
found_layout.setOnClickListener(this);
settings_layout.setOnClickListener(this);
//重写onClick事件
public void onClick(View view) {
switch (view.getId()) {
case R.id.course_layout:
setChioceItem(0);
case R.id.found_layout:
setChioceItem(1);
case R.id.setting_layout:
setChioceItem(2);
//定义一个选中一个item后的处理
public void setChioceItem(int index)
//重置选项+隐藏所有Fragment
FragmentTransaction transaction = fManager.beginTransaction();
clearChioce();
hideFragments(transaction);
switch (index) {
course_image.setImageResource(R.drawable.ic_tabbar_course_pressed);
course_text.setTextColor(blue);
course_layout.setBackgroundResource(R.drawable.ic_tabbar_bg_click);
if (fg1 == null) {
// 如果fg1为空,则创建一个并添加到界面上
fg1 = new Fragment1();
transaction.add(R.id.content, fg1);
// 如果MessageFragment不为空,则直接将它显示出来
transaction.show(fg1);
found_image.setImageResource(R.drawable.ic_tabbar_found_pressed);
found_text.setTextColor(blue);
found_layout.setBackgroundResource(R.drawable.ic_tabbar_bg_click);
if (fg2 == null) {
// 如果fg1为空,则创建一个并添加到界面上
fg2 = new Fragment2();
transaction.add(R.id.content, fg2);
// 如果MessageFragment不为空,则直接将它显示出来
transaction.show(fg2);
settings_image.setImageResource(R.drawable.ic_tabbar_settings_pressed);
settings_text.setTextColor(blue);
settings_layout.setBackgroundResource(R.drawable.ic_tabbar_bg_click);
if (fg3 == null) {
// 如果fg1为空,则创建一个并添加到界面上
fg3 = new Fragment3();
transaction.add(R.id.content, fg3);
// 如果MessageFragment不为空,则直接将它显示出来
transaction.show(fg3);
//隐藏所有的Fragment,避免fragment混乱
private void hideFragments(FragmentTransaction transaction) {
if (fg1 != null) {
transaction.hide(fg1);
if (fg2 != null) {
transaction.hide(fg2);
if (fg3 != null) {
transaction.hide(fg3);
//定义一个重置所有选项的方法
public void clearChioce()
course_image.setImageResource(R.drawable.ic_tabbar_course_normal);
course_layout.setBackgroundColor(whirt);
course_text.setTextColor(gray);
found_image.setImageResource(R.drawable.ic_tabbar_found_normal);
found_layout.setBackgroundColor(whirt);
found_text.setTextColor(gray);
settings_image.setImageResource(R.drawable.ic_tabbar_settings_normal);
settings_layout.setBackgroundColor(whirt);
settings_text.setTextColor(gray);
最后说几句:
代码就上面的一点点,解析也很详细,看多两遍就应该能看懂了,
另外注意一点就是Fragment相关类导入的时候是v4包还是app包!
那里很容易出错的,关于app与v4包的Fragment可以看札记(3)的解析!
恩,这节就写到这里,下一节会实现Fragment与ViewPager的简单应用!
/s/1gdel98B前三节我们分别用不同的方式实现了普通底部导航栏的效果,而本节我们将会在第二个实例的基础上
加上ViewPager来实现滑动切换页面的效果!大部分朋友都知道这个ViewPager是什么东西吧,如果
不知道没关系,下面我们简单的来介绍一个这个控件!
1.ViewPager简单介绍
1)是怎么样的一个控件?
答:一个页面切换的组件,我们可以往里面填充多个View,然后我们可以通过触摸屏幕左右滑动
切换不同的View,和前面学习的ListView一样,我们需要一个Adapter(适配器),将要显示的View和
我们的ViewPager进行绑定,而ViewPager有他自己特定的Adapter——PagerAdapter!另外,Google
官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page以及管理
每个Page的生命周期!当然它给我们提供了两个不同的Adapter,他们分别是:
FragmentPageAdapter和FragmentStatePagerAdapter!
而我们本节用到的则是前者:FragmentPageAdapter!
另外要说一点的是ViewPager的缓存机制:
ViewPager会缓存当前页,前一页,以及后一页,比如有1,2,3,4这四个页面:
当我们处于第一页:缓存1,2
处于第二页:缓存 1,2,3
处于第三页:缓存2,3,4
——> 处于第四页缓存3,4这样!
2)使用PagerAdapter要重写相关方法:
getCount( ):获得viewpager中有多少个view
destroyItem( ):移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为了确保
在finishUpdate(viewGroup)返回时视图能够被移除。
instantiateItem( ):①将给定位置的view添加到ViewGroup(容器)中,创建并显示出来
②返回一个代表新增页面的Object(key),通常都是直接返回view本身就可以了,
当然你也可以自定义自己的key,但是key和每个view要一一对应的关系
isViewFromObject( ):判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是
代表的同一个视图(即它俩是否是对应的,对应的表示同一个View),通常我们直接写
return view == object;就可以了,至于为什么要这样讲起来比较复杂,后面有机会进行了解吧
貌似是ViewPager中有个存储view状态信息的ArrayList,根据View取出对应信息的吧!
PS:不一定要重写所有方法~
2.实现效果图以及工程目录结构:
先来看下我们要实现的效果吧
接下来看下我们的项目结构:
3.代码实现:
Step 1:相关资源文件的准备:
PS:我们是在实现底部导航栏方法2的基础上来写的,所以资源文件照搬即可!
这里就不贴多次了~!
Step 2:编写activity_main.xml的布局文件:
PS:只是把前面的FrameLayout替换成了:android.support.v4.view.ViewPager而已:
activity_mian.xml:
&RelativeLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"&
&RelativeLayout
android:id="@+id/ly_top_bar"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@color/bg_topbar"&
android:id="@+id/txt_topbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:gravity="center"
android:text="提醒"
android:textColor="@color/text_topbar"
android:textSize="18sp" /&
android:layout_width="match_parent"
android:layout_height="2px"
android:layout_alignParentBottom="true"
android:background="@color/div_white" /&
&/RelativeLayout&
&RadioGroup
android:id="@+id/rg_tab_bar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_alignParentBottom="true"
android:background="@color/bg_white"
android:orientation="horizontal"&
&RadioButton
android:id="@+id/rb_channel"
style="@style/tab_menu_item"
android:drawableTop="@drawable/tab_menu_channel"
android:text="@string/tab_menu_alert" /&
&RadioButton
android:id="@+id/rb_message"
style="@style/tab_menu_item"
android:drawableTop="@drawable/tab_menu_message"
android:text="@string/tab_menu_profile" /&
&RadioButton
android:id="@+id/rb_better"
style="@style/tab_menu_item"
android:drawableTop="@drawable/tab_menu_better"
android:text="@string/tab_menu_pay" /&
&RadioButton
android:id="@+id/rb_setting"
style="@style/tab_menu_item"
android:drawableTop="@drawable/tab_menu_setting"
android:text="@string/tab_menu_setting" /&
&/RadioGroup&
android:id="@+id/div_tab_bar"
android:layout_width="match_parent"
android:layout_height="2px"
android:layout_above="@id/rg_tab_bar"
android:background="@color/div_white" /&
&android.support.v4.view.ViewPager
android:id="@+id/vpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/div_tab_bar"
android:layout_below="@id/ly_top_bar" /&
&/RelativeLayout&
Step 3:编写Fragment的布局以及代码:
PS:这里为了顺便演示ViewPager的机制,特意写成了四个Fragment!在onCreateView中打印创建Log!
fg_content.xml:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bg_white"
android:orientation="vertical"&
android:id="@+id/txt_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="呵呵"
android:textColor="@color/text_yellow"
android:textSize="20sp" /&
&/LinearLayout&
MyFragment1.java:
* Created by Jay on
public class MyFragment1 extends Fragment {
public MyFragment1() {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fg_content, container, false);
TextView txt_content = (TextView) view.findViewById(R.id.txt_content);
txt_content.setText("第一个Fragment");
Log.e("HEHE", "1日狗");
其他三个照葫芦画瓢,换点东西就好!
Step 4:自定义FragmentPagerAdapter类:
代码很简单,只需传递一个FragmentManager过来,其他都在这里完成!
* Created by Jay on
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private final int PAGER_COUNT = 4;
private MyFragment1 myFragment1 =
private MyFragment2 myFragment2 =
private MyFragment3 myFragment3 =
private MyFragment4 myFragment4 =
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
myFragment1 = new MyFragment1();
myFragment2 = new MyFragment2();
myFragment3 = new MyFragment3();
myFragment4 = new MyFragment4();
public int getCount() {
return PAGER_COUNT;
public Object instantiateItem(ViewGroup vg, int position) {
return super.instantiateItem(vg, position);
public void destroyItem(ViewGroup container, int position, Object object) {
System.out.println("position Destory" + position);
super.destroyItem(container, position, object);
public Fragment getItem(int position) {
Fragment fragment =
switch (position) {
case MainActivity.PAGE_ONE:
fragment = myFragment1;
case MainActivity.PAGE_TWO:
fragment = myFragment2;
case MainActivity.PAGE_THREE:
fragment = myFragment3;
case MainActivity.PAGE_FOUR:
fragment = myFragment4;
Step 5:MainActivity的编写:
逻辑很简单,自己看~
MainActivity.java:
package com.jay.fragmentdemo4;
import android.os.B
import android.support.v4.view.ViewP
import android.support.v7.app.AppCompatA
import android.widget.RadioB
import android.widget.RadioG
import android.widget.TextV
* Created by Coder-pig on
public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener,
ViewPager.OnPageChangeListener {
//UI Objects
private TextView txt_
private RadioGroup rg_tab_
private RadioButton rb_
private RadioButton rb_
private RadioButton rb_
private RadioButton rb_
private ViewP
private MyFragmentPagerAdapter mA
//几个代表页面的常量
public static final int PAGE_ONE = 0;
public static final int PAGE_TWO = 1;
public static final int PAGE_THREE = 2;
public static final int PAGE_FOUR = 3;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
bindViews();
rb_channel.setChecked(true);
private void bindViews() {
txt_topbar = (TextView) findViewById(R.id.txt_topbar);
rg_tab_bar = (RadioGroup) findViewById(R.id.rg_tab_bar);
rb_channel = (RadioButton) findViewById(R.id.rb_channel);
rb_message = (RadioButton) findViewById(R.id.rb_message);
rb_better = (RadioButton) findViewById(R.id.rb_better);
rb_setting = (RadioButton) findViewById(R.id.rb_setting);
rg_tab_bar.setOnCheckedChangeListener(this);
vpager = (ViewPager) findViewById(R.id.vpager);
vpager.setAdapter(mAdapter);
vpager.setCurrentItem(0);
vpager.addOnPageChangeListener(this);
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_channel:
vpager.setCurrentItem(PAGE_ONE);
case R.id.rb_message:
vpager.setCurrentItem(PAGE_TWO);
case R.id.rb_better:
vpager.setCurrentItem(PAGE_THREE);
case R.id.rb_setting:
vpager.setCurrentItem(PAGE_FOUR);
//重写ViewPager页面切换的处理方法
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
public void onPageSelected(int position) {
public void onPageScrollStateChanged(int state) {
//state的状态有三个,0表示什么都没做,1正在滑动,2滑动完毕
if (state == 2) {
switch (vpager.getCurrentItem()) {
case PAGE_ONE:
rb_channel.setChecked(true);
case PAGE_TWO:
rb_message.setChecked(true);
case PAGE_THREE:
rb_better.setChecked(true);
case PAGE_FOUR:
rb_setting.setChecked(true);
PS:嘿嘿,上面我把导包部分的代码也贴出来了,就是害怕你们导错包,然后出现一些莫名其妙的错误!
因为ViewPager是v4包下面的,所以Fragment,FragmentManager,FragmentTransaction都是需要使用
V4包下的哦!另外获取FragmentManager的方法不是直接用getFragmentManager()而是使用
getSupportFragmentManager()哦!
4.代码下载:
FragmentDemo4:
本节小结:
好的,上面就是底部导航栏 + ViewPager实现简单滑动切换Fragment的实现过程了!
就说这么多,谢谢~
5.2.4 Fragment实例精讲——底部导航栏+ViewPager滑动切换页面Viewpager 不能动态的设置高度,一直使用第一个fragment页面的高度
&& 例如: 如果我的第一个页面的高度是100px,其他页面的高度是130px,当展示其他页面的时候,高度会自动设置成100px。
&&& 我的 Viewpager 页面有四个 fragments& 内容页面,我使用 pager.setOffscreenPageLimit(3);
代码如下:
public&class&CustomViewPager&extends&ViewPager{
&&&&public&CustomViewPager&(Context&context)&{
&&&&&&&&super(context);
&&&&public&CustomViewPager&(Context&context,&AttributeSet&attrs)&{
&&&&&&&&super(context,&attrs);
&&&&@Override
&&&&public&void&onMeasure(int&widthMeasureSpec,&int&heightMeasureSpec)&{
&&&&&&&&super.onMeasure(widthMeasureSpec,&heightMeasureSpec);
&&&&&&&&boolean&wrapHeight&=&MeasureSpec.getMode(heightMeasureSpec)&==&MeasureSpec.AT_MOST;
&&&&&&&&final&View&tab&=&getChildAt(0);
&&&&&&&&int&width&=&getMeasuredWidth();
&&&&&&&&int&tabHeight&=&tab.getMeasuredHeight();
&&&&&&&&if&(wrapHeight)&{
&&&&&&&&&&&&//&Keep&the&current&measured&width.
&&&&&&&&&&&&widthMeasureSpec&=&MeasureSpec.makeMeasureSpec(width,&MeasureSpec.EXACTLY);
&&&&&&&&int&fragmentHeight&=&measureFragment(((Fragment)&getAdapter().instantiateItem(this,&getCurrentItem())).getView());
&&&&&&&&heightMeasureSpec&=&MeasureSpec.makeMeasureSpec(tabHeight&+&fragmentHeight&+&(int)TypedValue.PLEX_UNIT_DIP,&50,&getResources().getDisplayMetrics()),&MeasureSpec.AT_MOST);
&&&&&&&&super.onMeasure(widthMeasureSpec,&heightMeasureSpec);
&&&&public&int&measureFragment(View&view)&{
&&&&&&&&if&(view&==&null)
&&&&&&&&&&&&return&0;
&&&&&&&&view.measure(0,&0);
&&&&&&&&return&view.getMeasuredHeight();
我的 CustomPagerTabStrip&:
int&expandSpec&=&MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE&&&&2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec,&expandSpec);
android.view.ViewGroup.LayoutParams&params&=&&getLayoutParams();
params.height&=&getMeasuredHeight();
我的xml文件
&RelativeLayout
&&&&&&&&&&&&android:id="@+id/relativePager"
&&&&&&&&&&&&android:layout_width="match_parent"
&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&&com.xxx.yyy.util.CustomViewPager
&&&&&&&&&&&&&&&&android:id="@+id/detailPager"
&&&&&&&&&&&&&&&&android:layout_width="match_parent"
&&&&&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&&&&&&com.xxx.yyy.util.CustomPagerTabStrip
&&&&&&&&&&&&&&&&&&&&android:id="@+id/detailTab"
&&&&&&&&&&&&&&&&&&&&android:layout_width="match_parent"
&&&&&&&&&&&&&&&&&&&&android:layout_height="wrap_content"
&&&&&&&&&&&&&&&&&&&&android:background="#161C28"
&&&&&&&&&&&&&&&&&&&&android:textColor="#FFFFFF"&/&
&&&&&&&&&&&&&/com.xxx.yyy.util.CustomViewPager&
&&&&&&&&&/RelativeLayout& &
我在调试的时候,Activity&初始化的时候 CustomViewPager&always 的onMeasure& 方法始终被调用4次,虽然都调用了,但是高度始终是第一个高度,
展示其他页面的时候& onMeasure 方法就没有再被掉用过,百度了很长时间也找不到有效的解决方法,求指导
我以前碰到过,用如下的方式解决的.
解决方法包含一个自定义的 scroll view& 和自定义的& view pager.,原理是& custom view pager 根据子内容的高度进行计算,高度在初始化的时候设置,并处理好 scroll view 的触摸事件(touch event ),就算用户不通过触摸滚动页面,用户也能够滚动页面。
Custom scroll view
public&class&CustomScrollView&extends&ScrollView&{
private&GestureDetector&mGestureD
public&CustomScrollView(Context&context,&AttributeSet&attrs)&{
&&&&super(context,&attrs);
&&&&mGestureDetector&=&new&GestureDetector(context,&new&YScrollDetector());
&&&&setFadingEdgeLength(0);
public&boolean&onInterceptTouchEvent(MotionEvent&ev)&{
&&&&return&super.onInterceptTouchEvent(ev)
&&&&&&&&&&&&&&&mGestureDetector.onTouchEvent(ev);
//&Return&false&if&we're&scrolling&in&the&x&direction
class&YScrollDetector&extends&SimpleOnGestureListener&{
&&&&@Override
&&&&public&boolean&onScroll(MotionEvent&e1,&MotionEvent&e2,
&&&&&&&&&&&&float&distanceX,&float&distanceY)&{
&&&&&&&&return&(Math.abs(distanceY)&&&Math.abs(distanceX));
Custom&view&pager
public&class&CustomPager&extends&ViewPager{
public&CustomPager&(Context&context)&{
&&&&super(context);
public&CustomPager&(Context&context,&AttributeSet&attrs)&{
&&&&super(context,&attrs);
public&void&onMeasure(int&widthMeasureSpec,&int&heightMeasureSpec)&{
&&&&super.onMeasure(widthMeasureSpec,&heightMeasureSpec);
&&&&boolean&wrapHeight&=&MeasureSpec.getMode(heightMeasureSpec)&==&MeasureSpec.AT_MOST;
&&&&final&View&tab&=&getChildAt(0);
&&&&int&width&=&getMeasuredWidth();
&&&&int&tabHeight&=&tab.getMeasuredHeight();
&&&&if&(wrapHeight)&{
&&&&&&&&//&Keep&the&current&measured&width.
&&&&&&&&widthMeasureSpec&=&MeasureSpec.makeMeasureSpec(width,&MeasureSpec.EXACTLY);
&&&&int&fragmentHeight&=&measureFragment(((Fragment)&getAdapter().instantiateItem(this,&getCurrentItem())).getView());
&&&&heightMeasureSpec&=&MeasureSpec.makeMeasureSpec(tabHeight&+&fragmentHeight&+&(int)TypedValue.PLEX_UNIT_DIP,&50,&getResources().getDisplayMetrics()),&MeasureSpec.AT_MOST);
&&&&super.onMeasure(widthMeasureSpec,&heightMeasureSpec);
public&int&measureFragment(View&view)&{
&&&&if&(view&==&null)
&&&&&&&&return&0;
&&&&view.measure(0,&0);
&&&&return&view.getMeasuredHeight();
Layout file
&com.example.demo2.activity.widget.CustomScrollView&xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"&&
&LinearLayout
&&&&android:layout_width="match_parent"
&&&&android:layout_height="wrap_content"
&&&&android:orientation="vertical"&&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&1"&/&
&&&&&View&style="@style/text_divider"&/&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&2"&/&
&&&&&&&&&com.example.demo2.activity.widget.CustomPager
&&&&&&&&&&android:id="@+id/myViewPager"
&&&&&&&&&&android:layout_width="match_parent"
&&&&&&&&&&android:layout_height="wrap_content"&/&
&&&&&View&style="@style/text_divider"&/&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&4"&/&
&&&&&View&style="@style/text_divider"&/&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&5"&/&
&&&&&View&style="@style/text_divider"&/&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&6"&/&
&&&&&View&style="@style/text_divider"&/&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&7"&/&
&&&&&View&style="@style/text_divider"&/&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&8"&/&
&&&&&View&style="@style/text_divider"&/&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&9"&/&
&&&&&View&style="@style/text_divider"&/&
&&&&&TextView
&&&&&&&&style="@style/text"
&&&&&&&&android:text="Text&10"&/&
&/LinearLayout&
public&class&MainActivity&extends&FragmentActivity&{
protected&void&onCreate(Bundle&savedInstanceState)&{
&&&&super.onCreate(savedInstanceState);
&&&&setContentView(R.layout.activity_main);
&&&&MyPagerAdapter&pageAdapter&=&new&MyPagerAdapter(getSupportFragmentManager());
&&&&ViewPager&pager&=&(ViewPager)findViewById(R.id.myViewPager);
&&&&pager.setAdapter(pageAdapter);
} Fragment adapter
fragments 不同的高度加入到viewpager, 其中FragmentBlue,Green&等& fragments 是你可以直接使用的, 你需要注意一件事,我统一使用了liner layout 布局
public class MyPagerAdapter extends FragmentPagerAdapter {
private List&Fragment&
public MyPagerAdapter(FragmentManager fm) {
&&& super(fm);
&&& this.fragments = new ArrayList&Fragment&();
&&& fragments.add(new FragmentBlue());
&&& fragments.add(new FragmentGreen());
&&& fragments.add(new FragmentPink());
&&& fragments.add(new FragmentRed());
public Fragment getItem(int position) {
&&& return fragments.get(position);
public int getCount() {
&&& return fragments.size();
原文地址:
整理发布,转载须标明出处。
我要追加问题,请求站长解决!

我要回帖

更多关于 viewpager放fragment 的文章

 

随机推荐