前面我们分别利用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. HDU 5696 ——区间的价值——————【线段树、快排思想】

    区间的价值 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  2. oracle 自动表分区

    Oracle 新功能自动分区: 实现代码: create table t_interval partition by range(created)//dba_objects 视图的一个字段 inter ...

  3. windows下查看 mysql二进制日志文件

    有时候需要将linux中的mysql从线上linux种down到windows查看,但是这种binlog日志是二进制的,应该怎么查看呢? 使用window上的mysqlbinlog.exe将其转码到另 ...

  4. [转]微信小程序联盟 跳坑《一百八十一》设置API:wx.openSetting使用说明

    本文转自:http://www.wxapp-union.com/forum.php?mod=viewthread&tid=4066 这个API解决了过去一个长久以来无法解决的问题,如何让用户重 ...

  5. 如何高效的算出2x8的值

    原文出自:https://blog.csdn.net/seesun2012 位移算法,如何高效的算出2*8的值,为什么8<<1,4<<2,2<<3,1<< ...

  6. crontab 设置服务器定期执行备份工作

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  7. rabbit的fanout扇形交换机

    rabbit引入交换机概念. 交换机与生产者绑定. 队列与消费者绑定. 队列又与交换机绑定. 扇形交换机是  fanout类型的. 类似于其他消息中间件的 topic.一对多(生产者推送消息到指定交换 ...

  8. Object.preventExtensions()使用技巧

    Object.preventExtensions() 方法让一个对象变的不可扩展,也就是永远不能再添加新的属性. // Object.preventExtensions将原对象变的不可扩展,并且返回原 ...

  9. select下拉框选择字体大小

    效果: 结合Bootstrap.jQuery和ES6字符串模板与箭头函数使用JavaScript DOM操作动态添加option,随着option:selected选中的字号而改变相应的字体大小 代码 ...

  10. Hello Activemq

    0. 如果永远是localhost 可能一直low下去 1.下载安装 activemq 1.1 从官网下载activemq.tar.gz 并上传(rz)到linux系统 并解压 tar zxvf /* ...