在上一篇中,我们将了使用ViewPager实现Tab效果。如果没有阅读过,可以点击下面的地址:

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

在这一篇中我们讲一下使用Fragment实现Tab效果,而这种实现方式也是推荐的方式。与用ViewPager实现的效果有一点不同。

一、效果展示

如下图:

                                 

使用Fragment不支持手指左右滑动,只支持底部按钮的点击来切换。它的中间不再是一个ViewPager布局了,而是一个用来存放Fragment的FrameLayout的布局。其顶部布局和底部布局没有什么变化。下面我们来看具体的代码吧。

二、资源准备

图片资源仍然是我们在上一篇文章中准备好的。直接复制到res下的drawable文件夹下就好。

三、具体代码

(1)布局搭建

顶部布局和底部布局以及几个Tab布局都没有变化,我们直接复制即可。只是把主布局中间的换成FrameLayout而已。主布局代码如下:

 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     <FrameLayout
11         android:id="@+id/lay_frame"
12         android:layout_width="match_parent"
13         android:layout_height="0dp"
14         android:layout_weight="1"></FrameLayout>
15
16     <include layout="@layout/bottum"/>"
17
18
19
20 </LinearLayout>

(2)构建每一个fragment类

下面我们就要把每一个Tab变成一个Fragment。新建类Hfragment继承自Fragment。如下:

 1 import android.os.Bundle;
 2 import android.support.v4.app.Fragment;
 3 import android.view.LayoutInflater;
 4 import android.view.View;
 5 import android.view.ViewGroup;
 6
 7 public class HFragment extends Fragment{
 8
 9
10     public View onCreateView(LayoutInflater inflater, ViewGroup container,
11             Bundle savedInstanceState) {
12
13         return inflater.inflate(R.layout.tab01,container,false);
14     }
15 }

同理我们还要新建类Sfragment,Ufragment,Yfragment。它们都是继承自Fragment。只不过中间渲染的布局分别为Tab02,Tab03,Tab04.这样我们的fagment就完成了。

注意:继承的类Fragment一定导入android.support.v4.app.Fragment;这个包,而不能是其他包下的。

(3)在MainActivity里就可以实现Tab了。

在MainActivty中,实现Tab主要的技术就是利用FragmentTransaction,开启一个事务。在这个事务中,将我们的fragment加入进来,并嵌套在中间的布局FrameLayout上。然后通过事务控制隐藏和显示每一个fragment来达到切换的目的。具体代码如下:

  1 import android.os.Bundle;
  2 import android.app.Activity;
  3 import android.support.v4.app.Fragment;
  4 import android.support.v4.app.FragmentActivity;
  5 import android.support.v4.app.FragmentManager;
  6 import android.support.v4.app.FragmentTransaction;
  7 import android.view.Menu;
  8 import android.view.View;
  9 import android.view.View.OnClickListener;
 10 import android.widget.ImageButton;
 11 import android.widget.LinearLayout;
 12
 13 public class MainActivity extends FragmentActivity implements OnClickListener{
 14
 15
 16     private Fragment hfrag;
 17     private Fragment sfrag;
 18     private Fragment ufrag;
 19     private Fragment yfrag;
 20
 21     private ImageButton himg;
 22     private ImageButton simg;
 23     private ImageButton uimg;
 24     private ImageButton yimg;
 25
 26     private LinearLayout hlay;
 27     private LinearLayout slay;
 28     private LinearLayout ulay;
 29     private LinearLayout ylay;
 30
 31     private FragmentTransaction ftr;//事务
 32
 33
 34
 35
 36     protected void onCreate(Bundle savedInstanceState) {
 37         super.onCreate(savedInstanceState);
 38         setContentView(R.layout.activity_main);
 39
 40         initView();//用来初始化数据控件
 41
 42         initEvent();//初始化事件
 43
 44         setSelected(0);//进入界面,先让其显示 第一个
 45     }
 46
 47
 48     private void initEvent() {
 49
 50         //设定点击事件
 51
 52         hlay.setOnClickListener(this);
 53         slay.setOnClickListener(this);
 54         ulay.setOnClickListener(this);
 55         ylay.setOnClickListener(this);
 56
 57     }
 58
 59
 60     //用来初始化的方法
 61     private void initView() {
 62
 63         //获得按钮
 64         himg = (ImageButton) findViewById(R.id.ibtn_hudie);
 65         simg = (ImageButton) findViewById(R.id.ibtn_set);
 66         uimg = (ImageButton) findViewById(R.id.ibtn_user);
 67         yimg = (ImageButton) findViewById(R.id.ibtn_yang);
 68
 69         //获得底部的线性布局
 70         hlay = (LinearLayout) findViewById(R.id.lay_hudie);
 71         slay = (LinearLayout) findViewById(R.id.lay_set);
 72         ulay = (LinearLayout) findViewById(R.id.lay_user);
 73         ylay = (LinearLayout) findViewById(R.id.lay_yang);
 74
 75
 76     }
 77
 78
 79     //监听点击事件
 80     public void onClick(View v) {
 81
 82         resetImg();//将按钮复位
 83
 84         switch(v.getId()){
 85
 86         case R.id.lay_hudie:
 87             setSelected(0);
 88             break;
 89         case R.id.lay_set:
 90             setSelected(1);
 91             break;
 92         case R.id.lay_user:
 93             setSelected(2);
 94             break;
 95         case R.id.lay_yang:
 96             setSelected(3);
 97             break;
 98
 99         }
100
101     }
102
103
104
105
106     //自定义一个方法,设定布局中间的FrameLayout的选择状态
107     private void setSelected(int i) {
108
109         //需要将按钮变亮,且需要切换fragment的状体
110         //获取事务
111         FragmentManager fm = getSupportFragmentManager();
112         ftr  = fm.beginTransaction();//开启一个事务
113         hideTransaction(ftr);//自定义一个方法,来隐藏所有的fragment
114
115         switch(i){
116         case 0:
117             if(hfrag == null){
118                 //实例化每一个fragment
119                 hfrag = new HFragment();
120                 //千万别忘记将该fragment加入到ftr中
121                 ftr.add(R.id.lay_frame, hfrag);
122                 }
123             ftr.show(hfrag);
124             himg.setImageResource(R.drawable.hudie2);
125             break;
126         case 1:
127             if(sfrag == null){
128                 sfrag = new SFragment();
129                 ftr.add(R.id.lay_frame, sfrag);
130         }
131                ftr.show(sfrag);
132             simg.setImageResource(R.drawable.set2);
133             break;
134         case 2:
135             if(ufrag == null){
136
137                 ufrag = new UFragment();
138                 ftr.add(R.id.lay_frame, ufrag);
139             }
140             ftr.show(ufrag);
141             uimg.setImageResource(R.drawable.user2);
142             break;
143         case 3:
144             if(yfrag == null){
145                 yfrag = new YFragment();
146                 ftr.add(R.id.lay_frame, yfrag);
147             }
148             ftr.show(yfrag);
149             yimg.setImageResource(R.drawable.yang2);
150             break;
151         }
152         ftr.commit();//最后千万别忘记提交事务
153     }
154
155     //隐藏fragment
156     private void hideTransaction(FragmentTransaction ftr) {
157
158         if(hfrag != null){
159             ftr.hide(hfrag);//隐藏该fragment
160         }
161         if(sfrag != null){
162             ftr.hide(sfrag);
163         }
164         if(ufrag != null){
165             ftr.hide(ufrag);
166         }
167         if(yfrag != null){
168             ftr.hide(yfrag);
169         }
170     }
171
172     //复位按钮,即设置按钮为暗色
173     private void resetImg() {
174
175         himg.setImageResource(R.drawable.hudie);
176         simg.setImageResource(R.drawable.set);
177         uimg.setImageResource(R.drawable.user);
178         yimg.setImageResource(R.drawable.yang);
179
180     }
181 }

注意:在这里继承的是FragmentActivity,导入包仍旧是android.support.v4.app.Fragment;

好了,这样我们就实现了Tab效果,运行一下程序可以看看。

四、总结

(1)为什么推荐Fragment来实现Tab效果?

因为使用Fragment可以将每一个Tab跟我们的MainActivity分开。这样有利于在每一个Fragment中实现较为复杂的效果,而MainnActivity只起到一个组合的作用。如果使用ViewPager方式 实现Tab,我们在每一个Tab上编写较为复杂的效果时会发现所有的代码都几乎在MainActivity上完成,这样会导入MainActivty冗长,不利于阅读和维护。

(2)在实现过程中,一律使用包android.support.v4.app.Fragment;  这一点千万别导入错误的包。

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

使用Fragment实现Tab效果相关推荐

  1. android 底部tab效果,Android 仿微信底部渐变Tab效果

    先来看一下效果图 除了第三个的发现Tab有所差别外,其他的基本还原了微信的底部Tab渐变效果 每个Tab都是一个自定义View,根据ImageView的tint属性来实现颜色渐变效果,tint属性的使 ...

  2. android actionbar tab,ActionBar+Fragment实现Tab

    还是从Tab的几个组成部分来分析:Tab标签页(ActionBar.Tab),Tab所切换内容部分content( Fragment实现) 1.新建每个Fragment, layout,Tab的内容部 ...

  3. 使用fragment实现tab

    原文:http://blog.csdn.net/guolin_blog/article/details/13171191 现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加 ...

  4. jQuery:仿MSN网站的tab效果

    今天不知怎的,一直在做tab的特效,看到MSN官网的tab效果不错,就花了一点点时间小做了一下,具体效果:如下 html代码: <div class="popular"> ...

  5. android UI进阶之仿iphone的tab效果

    相信很多人都喜欢iphone 酷炫的界面,虽然android的原生控件已经足够漂亮,但是往往不能满足用户越来越挑剔的眼光.其实,我们完全可以自己来绘制界面.今天我就来分享下做一个和iphone一样的t ...

  6. Android Activity中实现Fragment切换功能效果

    一个最简单的Activity中实现Fragment切换功能效果: 一.效果图: 二.快速实现: 一个Activity中添加多个Fragment进行切换实现相应的功能需求逻辑,比如在activity中有 ...

  7. tab效果——支持tab标题的宽度自适应

    自己做的tab效果,参考了jquery里tabs布,还不太完善,只是做了tab的基本效果 有时间了补充以下特点: 1.让current tab与其他tab等高 2.Ie浏览器下的圆角显示  1 < ...

  8. 使用ViewPager + Fragment实现微信底部Tab效果

    下面是最常用的Tab布局,最终实现效果 MainActivity的主文件代码: public class MainActivity extends FragmentActivity implement ...

  9. Android典型界面设计(4)——使用ActionBar+Fragment实现tab切换

    一.问题描述 之前我们使用ViewPager+Fragment区域内头部导航,在Android 3.0之后Google增加了新的ActionBar,可方便的实现屏幕Head部区域的 设计如返回键.标题 ...

最新文章

  1. mysql表情符号变为_mysql Emoji表情字符集转换
  2. java dh算法_https密钥交换DH算法
  3. Product Master data in C4C and data exchange with CRM via PI
  4. Java 8 Streams API:对流进行分组和分区
  5. 42021高考成绩查询北京6一个,北京高考成绩查询时间:6月27日
  6. NVisionXR_iOS教程五 —— 添加灯光渲染
  7. Qtalk 0.2.0版本(基于Qt的局域网聊天软件)
  8. 乔布斯:这九本书每个人都该读一读
  9. 第二章 工厂设计模式
  10. 阿里、字节跳动再度发力游戏,腾讯、网易怕了吗?
  11. 电脑计算机打不开显示远程过程,win10系统打不开图片提示“远程过程调用失败”的解决方法...
  12. 我精心整理的一些大牌男装正品店
  13. 分别编写两个类Point2D,Point3D来表示二维空间和三维空间的点
  14. linux——SMB文件共享及应用实例
  15. (二)admin-boot项目之整合mybatis-plus
  16. 基础拓扑学笔记(6)——射影平面
  17. linux 安装打印机驱动
  18. 南京晓庄学院计组期末复习限时训练03(第二章计算机的发展及应用)
  19. html 任务列表,任务列表.html
  20. 问题:关于信贷催收业绩指标之一:递延率flow through%的计算,考虑回冲金额后的修正公式

热门文章

  1. 也许有一天,你发觉日子特别的艰难,那可能是这次的收获将特别的巨大
  2. 天生棋局与棋局判断(C语言)
  3. 心理学导论--- 1 心理学在搞什么
  4. 吉他的那些事-----------------吉他零基础入门
  5. 百度笔经面经(Java)
  6. [转]ESMTP的三个认证方式: CRAM-MD5 PLAIN和LOGIN
  7. 自然语言处理(NLP)入门(1)——前言
  8. app不能备份数据,更改allowBackup为true,并重新打包apk
  9. windows远程桌面工具之间如何进行控制?
  10. 聚观早报 | 茅台市值超过腾讯位列第一;三星正研发智能戒指