参考链接:

http://www.iteye.com/topic/602737

这个写的很不错,我是跟着一步步写下来的,不过到最后也遇到了麻烦,就是不能将Tab标签的文字和图片分开,始终是重合的,而且每个具体的代码,还是搞了许久才出来,故而分享之,希望能给大家带来方便,也谢谢下面的高人,呵呵!

http://www.youmi.net/bbs/thread-102-1-4.html

这个和上面的代码是一样的,不过代码不全,对于初学者来说,考验的时候来了,完善就是提高的过程,不要怕麻烦!

下面就根据上面的参考自己写的,当然大部分是相同的,不过有详细的注释,完整的代码

如果有什么不明白就留言吧!呵呵

首先结果图:

图1:

图2:



图3:

当然界面没有前面的仁兄好看,我是讲究实用,美化需要自己慢慢做了

呵呵

下面直接代码:

  1. package com.woclub.tabactivitytest;
  2. import android.app.TabActivity;
  3. import android.content.res.ColorStateList;
  4. import android.graphics.Color;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.Gravity;
  8. import android.view.View;
  9. import android.widget.ImageView;
  10. import android.widget.LinearLayout;
  11. import android.widget.TabHost;
  12. import android.widget.TabWidget;
  13. import android.widget.TextView;
  14. import android.widget.TabHost.OnTabChangeListener;
  15. /**
  16. * 总结:在设置Tab的布局的时候首先需要newTabSpec再在其设置setIndicator(Tab名字,Tab的图标),
  17. * 尤其需要注意setContent(),它有三种使用方法setContent(int)它是直接在布局文件中设置其布局,
  18. * setContent(Intent)可以用Intent指定一个Activity,
  19. * setContent(TabContentFactory)可以用一个类来指定其布局的方式
  20. * @author Administrator
  21. *
  22. */
  23. public class MainActivity
    extends TabActivity {
  24. private static
    final String Tab1 = "Tab1";
  25. private static
    final String Tab2 = "Tab2";
  26. private static
    final String Tab3 = "Tab3";
  27. private static
    final String Tab4 = "Tab4";
  28. /** Called when the activity is first created. */
  29. @Override
  30. public void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.main);
  33. //1得到TabHost对象,正对TabActivity的操作通常都有这个对象完成
  34. final TabHost tabHost = this.getTabHost();
  35. final TabWidget tabWidget = tabHost.getTabWidget();
  36. //2生成一个Intent对象,该对象指向一个Activity,当然现在例子比较简单就没有绑定其他的Activity故而不用
  37. //3生成一个TabSpec对象,这个对象代表了一个Tab页
  38. TabHost.TabSpec tabSpec = tabHost.newTabSpec(Tab1);
  39. //设置该页的indicator(指示器)设置该Tab页的名字和图标,以及布局
  40. tabSpec.setIndicator(composeLayout("爽哉", R.drawable.coke))
  41. .setContent(R.id.view1);
  42. //4将设置好的TabSpec对象添加到TabHost当中
  43. tabHost.addTab(tabSpec);
  44. //第二个Tab
  45. tabHost.addTab(tabHost.newTabSpec(Tab2).setIndicator(composeLayout("安逸", R.drawable.coke))
  46. .setContent(R.id.view2));
  47. //第三个Tab
  48. tabHost.addTab(tabHost.newTabSpec(Tab3).setIndicator(composeLayout("开心", R.drawable.coke))
  49. .setContent(R.id.view3));
  50. //第四个Tab
  51. tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator(composeLayout("说明", R.drawable.coke))
  52. .setContent(R.id.view4));
  53. //setContent(TabContentFactory)可以用一个类来指定其布局的方式,前三个都是用的setContent(int)方式
  54. // CustomLayout custom = new CustomLayout(this);
  55. // tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator("Tab4", getResources()
  56. // .getDrawable(R.drawable.icon))
  57. // .setContent(custom));
  58. //*****************************这是对Tab标签本身的设置*******************************************
  59. int width =45;
  60. int height =48;
  61. for(int i =
    0; i < tabWidget.getChildCount(); i++)
  62. {
  63. //设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果
  64. tabWidget.getChildAt(i).getLayoutParams().height = height;
  65. tabWidget.getChildAt(i).getLayoutParams().width = width;
  66. /**
  67. * 下面是设置Tab的背景,可以是颜色,背景图片等
  68. */
  69. View v = tabWidget.getChildAt(i);
  70. if (tabHost.getCurrentTab() == i) {
  71. v.setBackgroundColor(Color.GREEN);
  72. //在这里最好自己设置一个图片作为背景更好
  73. //v.setBackgroundDrawable(getResources().getDrawable(R.drawable.chat));
  74. } else {
  75. v.setBackgroundColor(Color.GRAY);
  76. }
  77. }
  78. //************************************************************************************
  79. //设置Tab变换时的监听事件
  80. tabHost.setOnTabChangedListener(new OnTabChangeListener() {
  81. @Override
  82. public void onTabChanged(String tabId) {
  83. // TODO Auto-generated method stub
  84. //当点击tab选项卡的时候,更改当前的背景
  85. for(int i =
    0; i < tabWidget.getChildCount(); i++)
  86. {
  87. View v = tabWidget.getChildAt(i);
  88. if (tabHost.getCurrentTab() == i) {
  89. v.setBackgroundColor(Color.GREEN);
  90. } else {
  91. //这里最后需要和上面的设置保持一致,也可以用图片作为背景最好
  92. v.setBackgroundColor(Color.GRAY);
  93. }
  94. }
  95. }
  96. });
  97. }
  98. //#################################################################这是设置TabWidget的布局
  99. /**
  100. * 这个设置Tab标签本身的布局,需要TextView和ImageView不能重合
  101. * s:是文本显示的内容
  102. * i:是ImageView的图片位置
  103. * 将它设置到setIndicator(composeLayout("开心", R.drawable.coke))中
  104. */
  105. public View
    composeLayout(String s, int i){
  106. Log.e("Error", "composeLayout");
  107. LinearLayout layout = new LinearLayout(this);
  108. layout.setOrientation(LinearLayout.VERTICAL);
  109. TextView tv = new TextView(this);
  110. tv.setGravity(Gravity.CENTER);
  111. tv.setSingleLine(true);
  112. tv.setText(s);
  113. tv.setTextColor(Color.RED);
  114. layout.addView(tv,
  115. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  116. ImageView iv = new ImageView(this);
  117. iv.setImageResource(i);
  118. layout.addView(iv,
  119. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  120. return layout;
  121. }
  122. //#################################################################
  123. }

我都有详细的注释,估计大家都能看懂的,有些地方给了提示,扩展的需要就需要自己去完成了

下面是一个两个布局文件

一个是在layout中设置:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3. 一个典型的标签Activity 是由2 部分构成的 且其id都有规定 即:
  4. * TabWidget 用于展示标签页 id=tabs
  5. * FrameLayout 用于展示隶属于各个标签的具体布局 id=tabconten
  6. * TabHost 用于整个Tab布局 id=TabHost
  7. 还需注意要将Tab显示在最下面就需要这只LinearLayout时用Bottom
  8. -->
  9. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  10. android:id="@android:id/tabhost"
  11. android:layout_width="fill_parent"
  12. android:layout_height="fill_parent"
  13. >
  14. <LinearLayout
  15. android:orientation="vertical"
  16. android:gravity="bottom"
  17. android:layout_width="fill_parent"
  18. android:layout_height="fill_parent">
  19. <FrameLayout
  20. android:id="@android:id/tabcontent"
  21. android:layout_width="fill_parent"
  22. android:layout_height="200dip" >
  23. <RelativeLayout
  24. android:id="@+id/view1"
  25. android:orientation="vertical"
  26. android:layout_width="fill_parent"
  27. android:layout_height="fill_parent">
  28. <TextView
  29. android:id="@+id/text1"
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content"
  32. android:text="需要光临第一个Tab"/>
  33. <ImageView
  34. android:id="@+id/image1"
  35. android:layout_height="wrap_content"
  36. android:layout_below="@id/text1"
  37. android:layout_width="wrap_content"
  38. android:src="@drawable/icon"
  39. />
  40. </RelativeLayout>
  41. <TextView
  42. android:id="@+id/view2"
  43. android:layout_width="fill_parent"
  44. android:layout_height="fill_parent"
  45. android:text="需要光临第二个Tab"/>
  46. <TextView
  47. android:id="@+id/view3"
  48. android:layout_width="fill_parent"
  49. android:layout_height="fill_parent"
  50. android:text="需要光临第三个Tab"/>
  51. <TextView
  52. android:id="@+id/view4"
  53. android:layout_width="fill_parent"
  54. android:layout_height="fill_parent"
  55. />
  56. </FrameLayout>
  57. <TabWidget
  58. android:id="@android:id/tabs"
  59. android:layout_width="fill_parent"
  60. android:layout_height="wrap_content">
  61. </TabWidget>
  62. </LinearLayout>
  63. </TabHost>

还有一个在类中设置,设置都差不多,在此类中设置只是针对每个Tab页面的设置

  1. package com.woclub.tabactivitytest;
  2. import android.app.Activity;
  3. import android.view.Gravity;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.EditText;
  8. import android.widget.ImageView;
  9. import android.widget.LinearLayout;
  10. import android.widget.RadioButton;
  11. import android.widget.RadioGroup;
  12. import android.widget.TabHost;
  13. import android.widget.TextView;
  14. /**
  15. * 此类的功能是设置每个Tab标签的布局方式
  16. * 使用方法
  17. * CustomLayout ct = new CustomLayout(this);
  18. * tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));
  19. * @author Administrator
  20. *
  21. */
  22. public class CustomLayout
    implements TabHost.TabContentFactory{
  23. private Activity myActivity;
  24. private LayoutInflater layoutHelper;//用于实例化布局
  25. private LinearLayout layout;
  26. //构造函数,从外面传递参数Activity
  27. public CustomLayout(Activity myActivity)
  28. {
  29. this.myActivity = myActivity;
  30. //通过getLayoutInflater从Activity中得到一个实例化的LayoutInflater
  31. layoutHelper = myActivity.getLayoutInflater();
  32. }
  33. /**
  34. * 根据不同的Tab创建不同的视图
  35. */
  36. @Override
  37. public View createTabContent(String tag) {
  38. // TODO Auto-generated method stub
  39. return addCustomView(tag);
  40. }
  41. /**
  42. * 根据Tab的id设置不同Tab的view
  43. * 这是普通的设置方式,设置每个Tab的布局
  44. * @param id
  45. * @return
  46. */
  47. private View addCustomView(String id)
  48. {
  49. layout = new LinearLayout(myActivity);
  50. layout.setOrientation(LinearLayout.HORIZONTAL);
  51. if(id.equals("Tab1"))
  52. {
  53. ImageView iv = new ImageView(myActivity);
  54. iv.setImageResource(R.drawable.chat);
  55. //设置layout的布局,将一个ImageView添加到其中,并设置ImageView的布局格式,addView的第二个参数是设置ImageView的width和Height
  56. layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
  57. }
  58. else if(id.equals("Tab2"))
  59. {
  60. //第一个控件,注意每添加一个空间都需要用addView添加到layout中
  61. EditText edit = new EditText(myActivity);
  62. layout.addView(edit, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  63. //第二个控件
  64. Button button = new Button(myActivity);
  65. button.setText("确定");
  66. button.setWidth(100);
  67. layout.addView(button, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  68. //第三个控件
  69. RadioGroup rGroup = new RadioGroup(myActivity);
  70. rGroup.setOrientation(LinearLayout.HORIZONTAL);
  71. RadioButton radio1 = new RadioButton(myActivity);
  72. radio1.setText("Radio A");
  73. rGroup.addView(radio1);
  74. RadioButton radio2 = new RadioButton(myActivity);
  75. radio2.setText("Radio B");
  76. rGroup.addView(radio2);
  77. layout.addView(rGroup,
  78. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  79. }
  80. else if(id.equals("Tab3"))
  81. {
  82. TextView text = new TextView(myActivity);
  83. text.setText("the third TextView");
  84. text.setGravity(Gravity.CENTER);
  85. layout.addView(text);
  86. }
  87. else if(id.equals("Tab4"))
  88. {
  89. LinearLayout.LayoutParams param3 =
  90. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
  91. //在这里面又引用了布局文件来设置控件
  92. layout.addView(layoutHelper.inflate(R.layout.hello,
    null),param3);
  93. }
  94. return layout;
  95. }
  96. }

好了,该说的都在代码中说明了

希望大家喜欢,做的粗糙,就由大家去改进吧!

呵呵!

欢迎大家的讨论

转:http://hao3100590.iteye.com/blog/974343

TabActivity中的Tab标签详细设置的更多相关文章

  1. HTML中的<select>标签如何设置默认选中的选项

    方法有两种. 第一种通过<select>的属性来设置选中项,此方法可以在动态语言如php在后台根据需要控制输出结果. 1 2 3 4 5 < select  id =  " ...

  2. c# webConfig中的session超时详细设置

    webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 ses ...

  3. 在Bootstrap开发中解决Tab标签页切换图表显示问题

    在做响应式页面的时候,往往需要考虑更多尺寸设备的界面兼容性,一般不能写死像素,以便能够使得界面元素能够根据设备的不同进行动态调整,但往往有时候还是碰到一些问题,如Tab标签第一页面正常显示,但是切换其 ...

  4. head中的base标签:设置超链接的默认行为

    默认情况下,如果不指定超链接的target属性,则在当前窗口打开.使用head中的base可以制定超链接的base类,一切超链接都会继承它的属性. <html> <head> ...

  5. React Native 系列(九) -- Tab标签组件

    前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...

  6. QTabWidget 中 关于Tab 关闭和添加的基本教程!

    QTabWidget是PyQt5 中使用较为广泛的容器之一,经常会在日常使用的软件中用到它:QTabwidget是由几个标签组成,每个标签可以当作一个界面,下面就是应用Qtabwidget的一个简单例 ...

  7. [转]Form中控制Tab画布不同标签间切换的方法

    转自:http://yedward.net/?id=68 Form中一般常用的画布类型包括content.stacked.tab这三种,其实content类型的画布是每一个form都必须有的,而且只能 ...

  8. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  9. 转:设置Eclipse中的tab键为4个空格的完整方法

    from: https://my.oschina.net/xunxun10/blog/110074   设置Eclipse中的tab键为4个空格的完整方法 收藏 XunXun10 发表于 4年前 阅读 ...

随机推荐

  1. ZJNU 1333 - 第二题 blocks--中高级

    因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Writ ...

  2. Tensorflow学习教程------下载图像识别模型inceptionV3

    # coding: utf-8 import tensorflow as tf import os import tarfile import requests #inception模型下载地址 in ...

  3. tif图片压缩

    tif图片在ImageIo.read获取时,返回为空,导致无法使用,百度了很久,很多人说jai可以,便去看了下,总结如下: public static void CompressPic(String ...

  4. JVM(三)内存结构图

    JVM内存结构图:

  5. CSS公共样式模版

    CSS文件命名为global.css,一般此CSS文件是用于装全站主要框架CSS样式代码和初始化的CSS样式. 通常会放初始化CSS代码如下: body, div, ul, ol, dl, dt, d ...

  6. nips2014下载

    nips2014下载 wget http://papers.nips.cc/book/advances-in-neural-information-processing-systems-27-2014 ...

  7. java第三方工具包

    --搜集于网络 1.Apache POI 处理office文档用到的2. IText PDF操作类库 3.Java Base64 Base64编码类库 4.Commons-lang 对应java sd ...

  8. day50-线程-定时器

    #1.定时器: from threading import Timer def func(): print('定时器') t = Timer(1,func) #定时一秒,开启func线程. t.sta ...

  9. 使用node 做静态文件服务器

    # 1. 使用server-static 包 使用node可以非常快速的方法把指定目录共享出去 前提条件:安装了node,附带有npm 要托管的文件目录为 /root/www # 先创建一个目录用来存 ...

  10. 八、linux-mysql的mysql主从复制原理和实战

    1.mysql主从复制介绍 mysql支持单向.双向.链式级联.实时.异步复制,在复制过程中,一台服务器充当主服务器(Master),而一个或多个其它服务器充当从服务器(Slave). 复制:单向同步 ...