参考链接:

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. 踏出第一步——安装并跑通python程序

    一.首先学会安装python软件 1.在浏览器下输入安装python软件的官方网址. 点击打开链接 2.在界面上点击"Downloads"下的"Windows" ...

  2. iOS 添加view的分类(更加方便的设置view的位置)

    点击创建UIView的分类category,这里命名为 PLExtension(为了和下面对应) view分类.h文件 #import <UIKit/UIKit.h> @interface ...

  3. i春秋web作业2.26

    Web安全工程师(入门班) [全国线上入门班53期]课后作业   2020-2-26 DorinXL   1)为什么说js校验是一种不安全的校验方式? js校验不安全,是因为用户很容易通过控制台删除或 ...

  4. ZZJ_淘淘商城项目:day01(RESTful Web Service、SVN)

    淘淘商城项目是很适合初级Java程序员练习的实战项目,本次复习是另一位张老师教授的课,内容上与之前入老师版taotao商城比较有些新东西加了进来. 因此有必要记录下那些直到现在还可供参考的技术亮点分享 ...

  5. [原]CreateFile中的dwShareMode

    原 总结 API  一直对CreateFile的参数dwDesiredAccess和dwShareMode有什么不同不是很清楚,今天重读 windows核心编程的时候终于豁然开朗了. 真是书读百遍,其 ...

  6. Python语言学习:homework1

    '''购物车程序1.启动程序后,让用户输入工资,然后打印商品列表2.允许用户根据商品编号购买商品3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4.可随时退出,退出时,打印已购买商品和余额 ...

  7. vue中axios的post请求使用form表单格式发送数据

    vue使用插件qs实现 (qs 是一个增加了一些安全性的查询字符串解析和序列化字符串的库.) 在jquery中的ajax的方法已将此封装,所以不需要再次序列化 1. 安装   在项目中使用命令行工具输 ...

  8. swank: (too proud or confident) 炫耀;卖弄 to behave in way that is too proud or confident

    from : https://www.bing.com/dict/search?q=swank&qs=n&form=Z9LH5&sp=-1&pq=swank&s ...

  9. elastic search记录

    安装与启动 插件安装 中文分词器 https://github.com/medcl/elasticsearch-analysis-ik elastic api GET _search { " ...

  10. 1)关于配置centos的网络问题

    网址: http://jingyan.baidu.com/article/f3e34a12d886d2f5eb653515.html