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

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

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

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

一、修改主布局

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

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     >
 7
 8     <include layout="@layout/top"/>
 9
10     <android.support.v4.view.ViewPager
11         android:id="@+id/id_vp"
12         android:layout_width="match_parent"
13         android:layout_height="0dp"
14         android:layout_weight="1">
15
16     </android.support.v4.view.ViewPager>
17
18     <include layout="@layout/bottum"/>"
19
20 </LinearLayout>

二、修改MainAcitivty

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

  1 import java.util.ArrayList;
  2 import java.util.List;
  3
  4 import android.os.Bundle;
  5 import android.app.Activity;
  6 import android.support.v4.app.Fragment;
  7 import android.support.v4.app.FragmentActivity;
  8 import android.support.v4.app.FragmentManager;
  9 import android.support.v4.app.FragmentPagerAdapter;
 10 import android.support.v4.view.ViewPager;
 11 import android.support.v4.view.ViewPager.OnPageChangeListener;
 12 import android.view.Menu;
 13 import android.view.View;
 14 import android.view.View.OnClickListener;
 15 import android.widget.ImageButton;
 16 import android.widget.LinearLayout;
 17
 18 public class MainActivity extends FragmentActivity implements OnClickListener{
 19
 20     private ImageButton himg;
 21     private ImageButton simg;
 22     private ImageButton uimg;
 23     private ImageButton yimg;
 24
 25
 26     private Fragment hfrag;
 27     private Fragment sfrag;
 28     private Fragment ufrag;
 29     private Fragment yfrag;
 30
 31     private LinearLayout hlay;
 32     private LinearLayout slay;
 33     private LinearLayout ulay;
 34     private LinearLayout ylay;
 35
 36     private ViewPager vp;
 37     private FragmentPagerAdapter mAdapter;//适配器
 38     private List<Fragment> mDatas = new ArrayList<Fragment>();
 39
 40
 41     protected void onCreate(Bundle savedInstanceState) {
 42         super.onCreate(savedInstanceState);
 43         setContentView(R.layout.activity_main);
 44
 45         initView();//依旧是初始化
 46
 47         initEvent();//初始化事件
 48     }
 49
 50
 51     private void initEvent() {
 52         //设定点击事件
 53
 54         hlay.setOnClickListener(this);
 55         slay.setOnClickListener(this);
 56         ulay.setOnClickListener(this);
 57         ylay.setOnClickListener(this);
 58
 59         vp.setOnPageChangeListener(new OnPageChangeListener() {
 60
 61             public void onPageSelected(int arg0) {
 62
 63                 resetImg();
 64                 int i = vp.getCurrentItem();
 65
 66                 setTab(i);
 67
 68             }
 69
 70
 71             public void onPageScrolled(int arg0, float arg1, int arg2) {
 72
 73
 74             }
 75
 76
 77             public void onPageScrollStateChanged(int arg0) {
 78
 79
 80             }
 81         });
 82
 83     }
 84
 85
 86     private void initView() {
 87                 //获得按钮
 88                 himg = (ImageButton) findViewById(R.id.ibtn_hudie);
 89                 simg = (ImageButton) findViewById(R.id.ibtn_set);
 90                 uimg = (ImageButton) findViewById(R.id.ibtn_user);
 91                 yimg = (ImageButton) findViewById(R.id.ibtn_yang);
 92
 93                 //获得底部的线性布局
 94                 hlay = (LinearLayout) findViewById(R.id.lay_hudie);
 95                 slay = (LinearLayout) findViewById(R.id.lay_set);
 96                 ulay = (LinearLayout) findViewById(R.id.lay_user);
 97                 ylay = (LinearLayout) findViewById(R.id.lay_yang);
 98
 99                 //获取fragment
100                 hfrag = new HFragment();
101                 sfrag = new SFragment();
102                 ufrag = new UFragment();
103                 yfrag = new YFragment();
104
105                 //加入数据集
106                 mDatas.add(hfrag);
107                 mDatas.add(sfrag);
108                 mDatas.add(ufrag);
109                 mDatas.add(yfrag);
110
111                 vp = (ViewPager) findViewById(R.id.id_vp);
112
113                 mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
114
115                     public int getCount() {
116
117                         return mDatas.size();
118                     }
119
120                     public Fragment getItem(int position) {
121
122                         return mDatas.get(position);
123                     }
124                 };
125
126
127                 vp.setAdapter(mAdapter);
128
129     }
130
131     public void onClick(View v) {
132
133     resetImg();//将按钮复位
134
135         switch(v.getId()){
136
137         case R.id.lay_hudie:
138             setSelected(0);
139             break;
140         case R.id.lay_set:
141             setSelected(1);
142             break;
143         case R.id.lay_user:
144             setSelected(2);
145             break;
146         case R.id.lay_yang:
147             setSelected(3);
148             break;
149         }
150     }
151
152     private void setSelected(int i) {
153         //需要将按钮变亮,且需要切换fragment的状体
154
155                 setTab(i);
156             vp.setCurrentItem(i);//设定当前的item
157
158     }
159
160     //该方法用来设定按钮的高亮
161     private void setTab(int i){
162         switch(i){
163         case 0:
164             himg.setImageResource(R.drawable.hudie2);
165             break;
166         case 1:
167             simg.setImageResource(R.drawable.set2);
168             break;
169         case 2:
170             uimg.setImageResource(R.drawable.user2);
171             break;
172         case 3:
173             yimg.setImageResource(R.drawable.yang2);
174             break;
175         }
176     }
177
178     private void resetImg() {
179
180         himg.setImageResource(R.drawable.hudie);
181         simg.setImageResource(R.drawable.set);
182         uimg.setImageResource(R.drawable.user);
183         yimg.setImageResource(R.drawable.yang);
184
185     }
186 }

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

三、总结

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

转载于:https://www.cnblogs.com/fuly550871915/p/4850064.html

使用ViewPager和FragmentPagerAdapter实现Tab相关推荐

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

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

  2. android之tab分页标签的实现方法,Android应用中使用ViewPager和ViewPager指示器来制作Tab标签...

    一.ViewPageIndicator开源框架的基本用法我们先得去Github上面下载这个库,下载地址:https://github.com/JakeWharton/Android-ViewPager ...

  3. 处女男学Android(十一)---Gallery、ViewPager和ViewPager+Fragment实现的Tab导航

    一.前言 转载请标明出处:http://blog.csdn.net/wlwlwlwl015/article/details/42087915 有阵子没更新博客了,主要是最近公司接了个P2P的金融借贷项 ...

  4. 一直以来使用ViewPager和FragmentPagerAdapter或FragmentStatePagerAdapter管理Fragment的错误

    一直以来我在用viewpager和FragmentPagerAdapter或FragmentStatePagerAdapter管理fragment的时候总是和下面的代码类似,但是下面的代码在某些情况下 ...

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

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

  6. tabLayout+viewPager+fragment,当tab数目较少,能一屏展示时

    最近做了个推荐影片的APP,根据标签展示不同的视频列表,用遥控器上下左右按键来操作标签.当标签数目较少,能一屏展示时的代码如下: acivity_main.xml <?xml version=& ...

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

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

  8. Android Tab大总结 Fragment+TabPageIndicator+ViewPager

    2019独角兽企业重金招聘Python工程师标准>>> 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24740 ...

  9. android tabpageindicator 参数,Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)...

    Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结.目前写了: 1.传统的ViewPager实现 2.FragmentManager+Fragment实现 3.V ...

最新文章

  1. hdu 5617 Jam's maze(双线程dp)
  2. python找出一个数的所有因子_python – 找到最大素因子的正确算法
  3. [高精度乘法]BZOJ 1754 [Usaco2005 qua]Bull Math
  4. Java—List集合详解
  5. 使用Python scikit-learn 库实现神经网络算法
  6. 深度剖析Java数据结构之队列(一)——双端队列(ArrayDeque)
  7. B00001 C语言动态存储分配空间作为数组
  8. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 所有的基础数据都可以恢复删除...
  9. SQL:查询表中各类点数量以及各类点满足某条件数量
  10. mt4 显示服务器时间,MQL4编程学习之MT4显示任意时间周期指标的使用方法
  11. VS2017 CUDA编程学习实例3:CUDA实现直方图统计
  12. QGIS Server安装教程
  13. 物联网设备开发中常说的 AT 指令集是什么?
  14. SecKill学习初步框架时报错记录
  15. python爬取“堆糖网”小姐姐 图片
  16. MSP430F149的看门狗定时器
  17. 直击14号台风“灿都”最新消息!浙江多地停课停运,上海严阵以待!
  18. 金蝶云苍穹笔记(一)
  19. 智能驾驶视觉传感器测试:自动驾驶车辆如何进行传感器标定?
  20. sja1000编程c语言,基于51单片机SJA1000 CAN通讯实现(C语言程序)

热门文章

  1. 保卫资金链:资金链的五种死法和五种活法
  2. Nodejs实现给手机发送短信验证码用于登录功能(免费短信)
  3. 烤仔说 | Babe Babe Běibèi oh~
  4. DataFrame 数据筛选
  5. 栾云开 作业 笔记
  6. c语言中输出1st,高等学校计算机等级考试C语言模拟试题1st-all.doc
  7. git 查看自己秘钥_git生成和检查秘钥操作
  8. python模拟输入回车键_Python模拟回车键
  9. MacBook Pro 时间机器备份(完美解决连接移动硬盘无反应)
  10. 情侣相处最佳模式,写得很有道理~