什么是TabHost?

TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用windows操作系统的时候,经常见到如图所示的图形界面。

TabHost选项卡,说到这个组件,不得不先说一件事情,翻翻谷歌提供给我们的API,我们可以发现这样的一段话:

它告诉我们,这个组件在安卓4.0之后已经被废弃了,建议我们新的程序应该使用Fragment组件来代替它。

其实并不出乎意料,使用过TabHost的朋友应该都知道:

1、它的设计违反了Activity单一窗口原则,它可以同时加载多个Activity,然后再它们之间进行来回切换。

2、有个很致命的问题就是当我们点击别的选项时,按下Back后退键,它会使整个应用程序都退出,而不是切换到前一个选项卡,虽然我们可以在主程序里覆写OnKeyDown这个方法,但这样就会导致每一次按下Back后退键都只能回到第一个选项菜单。

但作为开发者,这个具有历史里程碑的组件,我们还是需要去掌握下,下面给几张图来看下今天要实现的效果:

下面附上代码(注释很详细)

实现TabHost有两种方式:

方式一:直接让一个Activity程序继承TabActivity类(通过getTabHost取得实例);

方式二:定义XML布局文件利用findViewById()方法取得TagHost组件,通过setup()方法实例化并进行若干配置;

下面讲解以第二种方式为例,先看下项目结构:

1、TabHost主布局文件

activity_main.xml(为了使选项卡显示在屏幕下方,这里采用了相对布局)

1

2 android:id="@+id/mytabhost"

3 android:layout_width="fill_parent"

4 android:layout_height="fill_parent">

5

6

7

8

10 android:layout_height="fill_parent"

11 >

12

13

17

18

20 android:layout_width="fill_parent"

21 android:layout_height="fill_parent"

22 >

23

24

25

26

27

29 android:layout_width="fill_parent"

30 android:layout_height="wrap_content"

31 android:background="@drawable/tab_widget_background"

32 android:layout_alignParentBottom="true"

33 >

34

35

36

37

38

TabHost的布局的文件必须遵循下面几点:

1、所有的用于标签配置的文件,必须以“”为根节点;

2、为了保证标签页和标签内容显示正常(例如:标签提示要放在标签显示内容之上)则可以采用一个布局管理器进行布局(例如:LinearLayout,RelativeLayout..)

3、定义一个“”的标签,用于表示整个标签容器,另外在定义此组件ID为“tabs”,表示允许加入多个标签

4、由于TabHost是FrameLayout的子类,所以要想定义标签页内容必须使用FrameLayout布局,并且标签ID为“tabcontent”

至于为什么要遵循这些条件,我们打看下TabHost的源码就可以发现:

2、每个标签的布局文件

tab_layout.xml

1 <?xml version="1.0" encoding="utf-8"?>

2

3 android:layout_width="wrap_content"

4 android:layout_height="wrap_content"

5 android:gravity="center_horizontal"

6 android:background="@drawable/tab_selector"

7 android:orientation="vertical" >

8

9

11 android:layout_width="wrap_content"

12 android:layout_height="wrap_content"

13 android:padding="3dp" />

14

15

17 android:layout_width="wrap_content"

18 android:layout_height="wrap_content"

19 android:textColor="@android:color/white"/>

20

21

3、一个选择器,用于美观效果

tab_selector.xml

1 <?xml version="1.0" encoding="utf-8"?>

2

3

5 >

6

8 >

9

10

4、跳转Activity的布局文件(由于基本一致,这里只给出其中一个)

tabactivity.xml

1 <?xml version="1.0" encoding="utf-8"?>

2

3 android:layout_width="match_parent"

4 android:layout_height="match_parent" >

5

6

8 android:layout_height="match_parent"

9 android:orientation="vertical" >

10

11

12

14 android:layout_width="wrap_content"

15 android:layout_height="wrap_content"

16 android:text="我是界面1"/>

17

18

19

5、JAVA主代码

1 packagecom.example.tabhosttest;2

3 importandroid.app.ActivityGroup;4 importandroid.content.Intent;5 importandroid.os.Bundle;6 importandroid.view.View;7 importandroid.widget.ImageView;8 importandroid.widget.TabHost;9 importandroid.widget.TabHost.TabSpec;10 importandroid.widget.TextView;11

12 public class MainActivity extendsActivityGroup{13

14 private TabHost tabHost;//声明一个TabHost对象15

16 //资源文件

17 private Class activitys[]={TabActivity1.class,TabActivity2.class,TabActivity3.class,TabActivity4.class,TabActivity5.class};//跳转的Activity

18 private String title[]={"首页","搜索","设置","主题","更多"};//设置菜单的标题

19 private int image[]={R.drawable.tab_icon1,R.drawable.tab_icon2,R.drawable.tab_icon3,R.drawable.tab_icon4,R.drawable.tab_icon5,};//设置菜单

20

21 @Override22 protected voidonCreate(Bundle savedInstanceState) {23 super.onCreate(savedInstanceState);24 setContentView(R.layout.activity_main);25 initTabView();//初始化tab标签

26

27 }28

29 private voidinitTabView() {30 //实例化tabhost

31 this.tabHost=(TabHost) findViewById(R.id.mytabhost);32 //由于继承了ActivityGroup,所以需要在setup方法里加入此参数,若继承TabActivity则可省略

33 tabHost.setup(this.getLocalActivityManager());34

35 //创建标签

36 for(int i=0;i

38 View view=View.inflate(this, R.layout.tab_layout, null);39

40 //设置imageview

41 ImageView imageView=(ImageView) view.findViewById(R.id.image);42 imageView.setImageDrawable(getResources().getDrawable(image[i]));43 //设置textview

44 TextView textView=(TextView) view.findViewById(R.id.title);45 textView.setText(title[i]);46 //设置跳转activity

47 Intent intent=new Intent(this, activitys[i]);48

49 //载入view对象并设置跳转的activity

50 TabSpec spec=tabHost.newTabSpec(title[i]).setIndicator(view).setContent(intent);51

52 //添加到选项卡

53 tabHost.addTab(spec);54 }55

56 }57

58

59 }

这里有个重载方法setIndicator(),这里是用来设置标签页:

设置标题,此时无图标

设置标题、图标(这里的图标可以用getResources().getDrawable(int id))来设置

设置自定义view

还有个setContent(Intent intent),这里是用来设置标签内容的,也就是我们要跳转的Activity

由于这里有5个选项卡,因此就有5个Activity,具体内容就看自己需求了,这里就不再给出

记得写完Activity要在AndroidManifest.xml配置文件中声明

1 <?xml version="1.0" encoding="utf-8"?>

2

3 package="com.example.tabhosttest"

4 android:versionCode="1"

5 android:versionName="1.0" >

6

7

9 android:targetSdkVersion="21" />

10

11

13 android:icon="@drawable/ic_launcher"

14 android:label="@string/app_name"

15 android:theme="@style/AppTheme" >

16

18 android:label="@string/app_name" >

19

20

21

22

23

24

25

27 android:label="@string/app_name" >

28

29

31 android:label="@string/app_name" >

32

33

35 android:label="@string/app_name" >

36

37

39 android:label="@string/app_name" >

40

41

43 android:label="@string/app_name" >

44

45

46

47

好了,到这里底部导航菜单就实现了,试试吧~

java底部菜单_安卓开发笔记——TabHost组件(一)(实现底部菜单导航)相关推荐

  1. centos配置java环境变量_【开发笔记】-CentOS配置Java环境变量

    如果开发java应用,经常需要配置JAVA_HOME路径,如果是通过yum安装的jdk(一般系统会自带open-jdk),下面讲述配置过程: A 定位JDK安装路径 1. 终端输入: which ja ...

  2. react 树形菜单_关于React 使用antd组件递归实现左侧菜单导航树(MenusTree)的示例...

    一.菜单组件Demo 这里本人采用的是蚂蚁金服(antd)组件库里的{Menu}组件写的一个左侧菜单树的小Demo(整套开发环境是React+Redux+webpack) import React f ...

  3. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  4. 安卓开发笔记——打造属于自己的博客园APP(一)

    最近事情比较多,博客更新又落下了,平时有个习惯,喜欢睡前看看博客园里博友的文章,但一直感觉APP市场上下载下来的博客园客户端用起来并不是很舒服,近来发现博客园也有对外开放的数据接口,所以打算自己写个博 ...

  5. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  6. [安卓开发笔记一]Android开发配置opencv环境超详细教程

    [安卓开发笔记一]Android开发配置opencv环境超详细教程 [更新于 2022年4月] 再次提醒,建议现在看到这篇文章的,仅仅把此文做一个流程参考,4年前android studio就使用cm ...

  7. 在外包公司从 Java 后端干到安卓开发,你醒醒吧,阿里大师推荐的这份 Java 开发必读书单

    先是工作内容的问题. 当初他应聘的岗位是后端开发,可现实却是他既要写后端,也要写客户端.本着做的多做的广可以学到更多的原则,他并不是非常在意这个问题,边做边学,渐渐地也上了手. 其次是工作量的问题. ...

  8. sqllite开发安卓项目_安卓学习笔记(一)

    本人接触安卓也有一年半载了.本人是c++程序员,我对于安卓和java的态度就像,c++是大老婆,java和安卓是小老婆.但是大老婆总是让人不省心,所以安卓还是挺好玩的.那么接下来写写文章,记录一下安卓 ...

  9. Android开发笔记(十九)底部标签栏TabBar

    底部标签页实现思路 现在的APP,大多在页面底部显示标签栏Tabbar,用于切换不同栏目的页面.Tabbar起源于iOS,iOS的Tabbar自动位于页面下方,可是Android搬过来的时候做了改动, ...

最新文章

  1. 2w字 + 40张图带你参透并发编程!
  2. python两个集合的交集 合集 差集
  3. 使用WinCrypt进行简单的对称加密实例
  4. 通过“四大行为”对WCF的扩展[原理篇]
  5. Web框架——Flask系列之abort函数与自定义异常处理(十三)
  6. 安卓系统组态软件_第六代组态软件夸平台支持苹果安卓手机APP智能控制PLC
  7. mschart走势图 vc_在VC++中使用MSChart表格控件(小结)
  8. cad工具箱详细讲解_AutoCAD学院派工具箱(XCAD)使用教程(图文解说)
  9. ubuntu Opencv4及扩展模块编译安装过程
  10. 浅谈如何带领好一个团队
  11. baocms7.0版本一元云购报错Call-time pass-by-reference has been removed处理办法
  12. 【天怒人怨爸爸系列】一年级数学口算题生成程序
  13. Opencv 中的向量类Vec
  14. 长链接短链接拉起拼多多问题
  15. ping ping ping
  16. 华为eNSP 路由器单臂路由配置
  17. win10系统的计算机C盘在哪,win10系统电脑C盘programdata在哪的图文办法
  18. 用友-应收应付重分类公式设置
  19. 每天一个npm包 之 qs
  20. Python复数属性和方法操作实例

热门文章

  1. python数据结构剑指offer-二维数组中的查找
  2. c++中,可以用delete释放一个数组的空间吗?
  3. Core Data数据操作
  4. 排列组合算法之一: 01转换法_java改变后的c++版
  5. linux firefox 检查组件是否加载,利用火狐浏览器查看网站加载速度
  6. python循环输入若干学生信息网_python最简学生信息系统,练习while
  7. C语言和设计模式(之原型模式)
  8. win服务器自动发邮件,asp.net基于windows服务实现定时发送邮件的方法
  9. linux查看cpu核数_我们常说的CPU核数指的是什么?
  10. android poi读写,Android-android中怎样使用poi