前面我们分别利用ViewPager和Fragment实现了Tab效果。但是使用Fragment实现的Tab不能够左右滑动。如果我们既想使用Fragment又想让Tab能够滑动,那么怎么办呢?这 就是今天的方法,利用ViewPager和FragmentPagerAdapter来实现Tab。

没看过前两篇文章的读者可以点击下面的地址:

http://www.cnblogs.com/fuly550871915/p/4850056.html

废话不多说了,效果还是之前的效果。由于有些代码我们已经写过了。我们复用《使用Fragment实现Tab》这篇文章里的代码,保留所有的东西,只需要修改两个地方即可。

一、修改主布局

只需要把activity_main.xml的布局中间的改为ViewPager即可。代码如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <include layout="@layout/top"/> <android.support.v4.view.ViewPager
android:id="@+id/id_vp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"> </android.support.v4.view.ViewPager> <include layout="@layout/bottum"/>" </LinearLayout>

二、修改MainAcitivty

其实方法跟第一篇文章《使用ViewPager实现Tab》类似,只不过是将适配器改为了FragmentPagerAdapter而已,那么相应的数据集里面的泛型也就应该是Fragment实例了。总结,如果前两篇文章你认真看了并做了,下面的代码还是挺简单的。具体如下:

 import java.util.ArrayList;
import java.util.List; import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout; public class MainActivity extends FragmentActivity implements OnClickListener{ private ImageButton himg;
private ImageButton simg;
private ImageButton uimg;
private ImageButton yimg; private Fragment hfrag;
private Fragment sfrag;
private Fragment ufrag;
private Fragment yfrag; private LinearLayout hlay;
private LinearLayout slay;
private LinearLayout ulay;
private LinearLayout ylay; private ViewPager vp;
private FragmentPagerAdapter mAdapter;//适配器
private List<Fragment> mDatas = new ArrayList<Fragment>(); protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView();//依旧是初始化 initEvent();//初始化事件
} private void initEvent() {
//设定点击事件 hlay.setOnClickListener(this);
slay.setOnClickListener(this);
ulay.setOnClickListener(this);
ylay.setOnClickListener(this); vp.setOnPageChangeListener(new OnPageChangeListener() { public void onPageSelected(int arg0) { resetImg();
int i = vp.getCurrentItem(); setTab(i); } public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageScrollStateChanged(int arg0) { }
}); } private void initView() {
//获得按钮
himg = (ImageButton) findViewById(R.id.ibtn_hudie);
simg = (ImageButton) findViewById(R.id.ibtn_set);
uimg = (ImageButton) findViewById(R.id.ibtn_user);
yimg = (ImageButton) findViewById(R.id.ibtn_yang); //获得底部的线性布局
hlay = (LinearLayout) findViewById(R.id.lay_hudie);
slay = (LinearLayout) findViewById(R.id.lay_set);
ulay = (LinearLayout) findViewById(R.id.lay_user);
ylay = (LinearLayout) findViewById(R.id.lay_yang); //获取fragment
hfrag = new HFragment();
sfrag = new SFragment();
ufrag = new UFragment();
yfrag = new YFragment(); //加入数据集
mDatas.add(hfrag);
mDatas.add(sfrag);
mDatas.add(ufrag);
mDatas.add(yfrag); vp = (ViewPager) findViewById(R.id.id_vp); mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { public int getCount() { return mDatas.size();
} public Fragment getItem(int position) { return mDatas.get(position);
}
}; vp.setAdapter(mAdapter); } public void onClick(View v) { resetImg();//将按钮复位 switch(v.getId()){ case R.id.lay_hudie:
setSelected(0);
break;
case R.id.lay_set:
setSelected(1);
break;
case R.id.lay_user:
setSelected(2);
break;
case R.id.lay_yang:
setSelected(3);
break;
}
} private void setSelected(int i) {
//需要将按钮变亮,且需要切换fragment的状体 setTab(i);
vp.setCurrentItem(i);//设定当前的item } //该方法用来设定按钮的高亮
private void setTab(int i){
switch(i){
case 0:
himg.setImageResource(R.drawable.hudie2);
break;
case 1:
simg.setImageResource(R.drawable.set2);
break;
case 2:
uimg.setImageResource(R.drawable.user2);
break;
case 3:
yimg.setImageResource(R.drawable.yang2);
break;
}
} private void resetImg() { himg.setImageResource(R.drawable.hudie);
simg.setImageResource(R.drawable.set);
uimg.setImageResource(R.drawable.user);
yimg.setImageResource(R.drawable.yang); }
}

好了,至此完成了所有的代码,快运行试试,是不是又可以左右滑动了。

三、总结

如果你的app中不要求具有左右滑动的功能,建议使用Fragment实现Tab。如果想有滑动效果的话,建议使用ViewPager和FragmenPagerAdapter来实现Tab。总之,使用Fragment可以大大提高我们的代码质量。

使用ViewPager和FragmentPagerAdapter实现Tab的更多相关文章

  1. 安卓开发_慕课网_ViewPager与FragmentPagerAdapter实现Tab实现Tab(App主界面)

    学习内容来自“慕课网” ViewPager与FragmentPagerAdapter实现Tab 将这两种实现Tab的方法结合起来.效果就是可以拖动内容区域来改变相应的功能图标亮暗 思路: Fragme ...

  2. Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)

    上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...

  3. ViewPager With FragmentPagerAdapter

    采用PagerAdapter中的FragmentPagerAdapter来实现页面切换,适用于a handful of typically more static fragments to be pa ...

  4. 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab

    大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHo ...

  5. 安卓开发之使用viewpager+fragment实现滚动tab页

    闲着.用viewpager+fragment实现了个滚动tab..轻拍,以后会陆续发先小东西出来..爱分享,才快乐.demo见附件.. package com.example.demo; import ...

  6. ViewPager(1)FragmentPagerAdapter

    FragmentPagerAdapter 适合只有少量的pager,所有pager同时全部存在,不会有被销毁的,page过多很容易内存溢出. 1,代码 1.1 ViewPagerMain.java i ...

  7. Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24740977 Android如今实现Tab类型的界面方式越来越多,今天就把常见的 ...

  8. ViewPager、Fragment、Matrix综合使用实现Tab滑页效果

    原文地址:http://www.cnblogs.com/kross/p/3372987.html 我们实现一个上面是一个可以左右滑动的页面,下面是三个可点击切换的tab按钮,tab按钮上还有一个激活条 ...

  9. [转][Android]FragmentPagerAdapter与FragmentStatePagerAdapter使用详解与区别

    原文链接:http://blog.csdn.net/zhaokaiqiang1992 FragmentPagerAdapter是android-support-v4支持包里面出现的一个新的适配器,继承 ...

随机推荐

  1. Win32 DPAPI加密编程

    DPAPI函数是CryptoAPI中少有的简单易用的加密函数,调用过程简单,其调用接口几乎不涉及密码学概念.Win32 DPAPI有4个函数,它们分别是CryptProtectData.CryptUn ...

  2. jmeter(1)——环境部署及安装

    公司人事还有老大都找我谈了一下2019的目标和技能成长规划,所以整体想了一下,技能方面,自己今年准备从性能测试开始着手,也去咨询了一下大神,切入点最好是工具.性能测试是一门非常庞大的课程,最初级,最入 ...

  3. linux下查看memcache版本

    用telnet 127.0.0.1 11211命令连接上memcache, 然后直接输入stats就可以得到memcache服务器的版本

  4. Linux 上安装Docker 并部署netcor2.1

    述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共享 ...

  5. Win7 开机启动

    1.注册表里面写代码,设置程序以开机启动; 但这样会需要管理员权限,添加程序以管理员权限启动后,又无法直接进入到软件启动界面,UAC控制 代码一: /// <summary> /// 设置 ...

  6. 2019 Java面试题

    马上又是一个金九银十的招聘旺季,小编在这里给大家整理了一套各大互联网公司面试都喜欢问的一些问题或者一些出场率很高的Java面试题,给在校招或者社招路上的你一臂之力. 首先我们需要明白一个事实,招聘的一 ...

  7. 第3章 css属性color的RGBA值

    颜色之RGBA RGB是一种色彩标准,是由红(R).绿(G).蓝(B)的变化以及相互叠加来得到各式各样的颜色.RGBA是在RGB的基础上增加了控制alpha透明度的参数. 语法: color:rgba ...

  8. js上传并且预览图片

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. IE 8兼容:<meta http-equiv="X-UA-Compatible" content="IE=edge" /> X-UA-Compatible的解释

    前言:9月份开始了,大四也真正的到来了.深知自己网页布局还有很大的缺陷,接下来打算从工作中抽时间出来模仿着一些互联网公司的网站.顺便把基础理论知识打好. 第一个目标:小米官网:后续会把练习的项目放到g ...

  10. Windows API编程----枚举系统进程

    1.该函数可以检索系统中的每个进程的标识符(进程ID) BOOL WINAPI EnumProcesses( _Out_ DWORD *pProcessIds, _In_  DWORD cb, _Ou ...