使用Fragment实现Tab效果

在上一篇中,我们将了使用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;  这一点千万别导入错误的包。

时间: 2024-08-08 01:25:03

使用Fragment实现Tab效果的相关文章

fragment做成选项卡,tab效果。 fragment+RadioGroup

fragment做成选项卡,tab效果. fragment+RadioGroup from://http://blog.csdn.net/zimo2013/article/details/12239349 1.Fragment概述 在一个Activity中, Fragment代表UI的一个部分或者一个行为.一个Activity可以结合多个Fragment对象,也可以在多个activity中使用相同Fragment字节码对应的不同对象.一个Fragment对象必须被嵌入在一个主Activity对象

android项目剖解之ViewPager+Fragment 实现tabhost效果

项目中需要用到底栏导航栏,滑动或者点击会切换上面的视图,如图: 这个效果使用Viewpager+Fragmen实现是主流方案,加入你之前对fragment不太了解,可以先看android之Fragment(官网资料翻译) 整个文件如下: 好了废话少说,先上布局文件:main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sche

JavaScript提高:002:ASP.NET使用easy UI实现tab效果

最近在做ASP.NET项目中,需要实现一个tab页控件.发现asp.net控件中没找到现成的.一般的实现都需要js和div配合.于是就用到了easyui里面的.使用也很简单,将easyui需要的js和样式文件都加载后.直接用div即可实现. 效果如下 代码也很简单,每个tab是一个div.引用easyui的样式即可. 页面代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server

低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航

Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actionbar05; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import a

Android两种为ViewPager+Fragment添加Tab的方式

在Android开发中ViewPager的使用是非常广泛的,而它不仅仅能够实现简单的开始引导页,还可以结合Fragment并添加Tab作为选项卡或为显示大批量页面实现强大的顺畅滑动 下面介绍两种为ViewPager+Fragment添加Tab的方式: 第一种: 在MainActivity布局中定义一个ViewPager 在MainActivity中声明ViewPager并实现它的Adapter继承自FragmentPagerAdapter 首先需要通过重写有参的构造方法来获取FragmentMa

利用target的特性,可以实现纯css的tab效果切换

基础知识: :target起作用的是href连接到的位置 如 <a href="#tab1">tab1</a> <div id="tab1" class="tab">This is a tab1</div> :target{ color:red; } 但点击a标签的时候,连接到id是tab1的div,对这个div起作用color:red; 如: <a href="#tab"

用Fragment实现Tab页面切换效果初步总结

前言: 最近在Android项目中需要在活动中实现多页面切换的功能,第一次是实现的过程中,是让Activity同时去加载三个界面的,通过点击tab按钮对页面设置隐藏和显示,实现页面切换效果,但是后面发现这种实现方式其实存在很多问题: 首先,同时去加载三个页面,切换Activity的速度会变慢,尤其是布局中如果有很多ImageView,ImageButton等使用到图片资源的控件时,切换效果非常不好: 其次,由于使用了很多图片资源,在退出Activity的时候,像Drawable,Bitmap等一

Android Studio 使用ViewPager + Fragment实现滑动菜单Tab效果 --简易版

描述: 之前有做过一个记账本APP,拿来练手的,做的很简单,是用Eclipse开发的: 最近想把这个APP重新完善一下,添加了一些新的功能,并选用Android Studio来开发: APP已经完善了一部分,现在就想把已经做好的功能整理一下,记录下来. 效果图: 可以手动滑动菜单 也可以通过点击头部菜单进行切换           具体实现的代码: 前台代码(activity_main.xml): 1 <?xml version="1.0" encoding="utf-

Android 各种实现Tab效果的实现方式

一.TabActivity + TabWidget + TabHost. 实现TAB类型界面,首先想到的就是这种方式.但是在API level 13之后官方就不建议使用它了.不过还是在这里简单说一下它的使用吧. 使用它的关键就是布局文件了.需要在布局中添加<TabHost>.<TabWidget>.<FrameLayout>这三个控件,id分别是系统提供的:@android:id/tabhost .@android:id/tabs .@android:id/tabcon