TabActivity中的Tab标签详细设置
参考链接:
http://www.iteye.com/topic/602737
这个写的很不错,我是跟着一步步写下来的,不过到最后也遇到了麻烦,就是不能将Tab标签的文字和图片分开,始终是重合的,而且每个具体的代码,还是搞了许久才出来,故而分享之,希望能给大家带来方便,也谢谢下面的高人,呵呵!
http://www.youmi.net/bbs/thread-102-1-4.html
这个和上面的代码是一样的,不过代码不全,对于初学者来说,考验的时候来了,完善就是提高的过程,不要怕麻烦!
下面就根据上面的参考自己写的,当然大部分是相同的,不过有详细的注释,完整的代码
如果有什么不明白就留言吧!呵呵
首先结果图:
图1:
图2:
图3:
当然界面没有前面的仁兄好看,我是讲究实用,美化需要自己慢慢做了
呵呵
下面直接代码:
- package com.woclub.tabactivitytest;
- import android.app.TabActivity;
- import android.content.res.ColorStateList;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.Gravity;
- import android.view.View;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TabHost;
- import android.widget.TabWidget;
- import android.widget.TextView;
- import android.widget.TabHost.OnTabChangeListener;
- /**
- * 总结:在设置Tab的布局的时候首先需要newTabSpec再在其设置setIndicator(Tab名字,Tab的图标),
- * 尤其需要注意setContent(),它有三种使用方法setContent(int)它是直接在布局文件中设置其布局,
- * setContent(Intent)可以用Intent指定一个Activity,
- * setContent(TabContentFactory)可以用一个类来指定其布局的方式
- * @author Administrator
- *
- */
- public class MainActivity
extends TabActivity { - private static
final String Tab1 = "Tab1"; - private static
final String Tab2 = "Tab2"; - private static
final String Tab3 = "Tab3"; - private static
final String Tab4 = "Tab4"; - /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //1得到TabHost对象,正对TabActivity的操作通常都有这个对象完成
- final TabHost tabHost = this.getTabHost();
- final TabWidget tabWidget = tabHost.getTabWidget();
- //2生成一个Intent对象,该对象指向一个Activity,当然现在例子比较简单就没有绑定其他的Activity故而不用
- //3生成一个TabSpec对象,这个对象代表了一个Tab页
- TabHost.TabSpec tabSpec = tabHost.newTabSpec(Tab1);
- //设置该页的indicator(指示器)设置该Tab页的名字和图标,以及布局
- tabSpec.setIndicator(composeLayout("爽哉", R.drawable.coke))
- .setContent(R.id.view1);
- //4将设置好的TabSpec对象添加到TabHost当中
- tabHost.addTab(tabSpec);
- //第二个Tab
- tabHost.addTab(tabHost.newTabSpec(Tab2).setIndicator(composeLayout("安逸", R.drawable.coke))
- .setContent(R.id.view2));
- //第三个Tab
- tabHost.addTab(tabHost.newTabSpec(Tab3).setIndicator(composeLayout("开心", R.drawable.coke))
- .setContent(R.id.view3));
- //第四个Tab
- tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator(composeLayout("说明", R.drawable.coke))
- .setContent(R.id.view4));
- //setContent(TabContentFactory)可以用一个类来指定其布局的方式,前三个都是用的setContent(int)方式
- // CustomLayout custom = new CustomLayout(this);
- // tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator("Tab4", getResources()
- // .getDrawable(R.drawable.icon))
- // .setContent(custom));
- //*****************************这是对Tab标签本身的设置*******************************************
- int width =45;
- int height =48;
- for(int i =
0; i < tabWidget.getChildCount(); i++) - {
- //设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果
- tabWidget.getChildAt(i).getLayoutParams().height = height;
- tabWidget.getChildAt(i).getLayoutParams().width = width;
- /**
- * 下面是设置Tab的背景,可以是颜色,背景图片等
- */
- View v = tabWidget.getChildAt(i);
- if (tabHost.getCurrentTab() == i) {
- v.setBackgroundColor(Color.GREEN);
- //在这里最好自己设置一个图片作为背景更好
- //v.setBackgroundDrawable(getResources().getDrawable(R.drawable.chat));
- } else {
- v.setBackgroundColor(Color.GRAY);
- }
- }
- //************************************************************************************
- //设置Tab变换时的监听事件
- tabHost.setOnTabChangedListener(new OnTabChangeListener() {
- @Override
- public void onTabChanged(String tabId) {
- // TODO Auto-generated method stub
- //当点击tab选项卡的时候,更改当前的背景
- for(int i =
0; i < tabWidget.getChildCount(); i++) - {
- View v = tabWidget.getChildAt(i);
- if (tabHost.getCurrentTab() == i) {
- v.setBackgroundColor(Color.GREEN);
- } else {
- //这里最后需要和上面的设置保持一致,也可以用图片作为背景最好
- v.setBackgroundColor(Color.GRAY);
- }
- }
- }
- });
- }
- //#################################################################这是设置TabWidget的布局
- /**
- * 这个设置Tab标签本身的布局,需要TextView和ImageView不能重合
- * s:是文本显示的内容
- * i:是ImageView的图片位置
- * 将它设置到setIndicator(composeLayout("开心", R.drawable.coke))中
- */
- public View
composeLayout(String s, int i){ - Log.e("Error", "composeLayout");
- LinearLayout layout = new LinearLayout(this);
- layout.setOrientation(LinearLayout.VERTICAL);
- TextView tv = new TextView(this);
- tv.setGravity(Gravity.CENTER);
- tv.setSingleLine(true);
- tv.setText(s);
- tv.setTextColor(Color.RED);
- layout.addView(tv,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- ImageView iv = new ImageView(this);
- iv.setImageResource(i);
- layout.addView(iv,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- return layout;
- }
- //#################################################################
- }
我都有详细的注释,估计大家都能看懂的,有些地方给了提示,扩展的需要就需要自己去完成了
下面是一个两个布局文件
一个是在layout中设置:
- <?xml version="1.0" encoding="utf-8"?>
- <!--
- 一个典型的标签Activity 是由2 部分构成的 且其id都有规定 即:
- * TabWidget 用于展示标签页 id=tabs
- * FrameLayout 用于展示隶属于各个标签的具体布局 id=tabconten
- * TabHost 用于整个Tab布局 id=TabHost
- 还需注意要将Tab显示在最下面就需要这只LinearLayout时用Bottom
- -->
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <LinearLayout
- android:orientation="vertical"
- android:gravity="bottom"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="200dip" >
- <RelativeLayout
- android:id="@+id/view1"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:id="@+id/text1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="需要光临第一个Tab"/>
- <ImageView
- android:id="@+id/image1"
- android:layout_height="wrap_content"
- android:layout_below="@id/text1"
- android:layout_width="wrap_content"
- android:src="@drawable/icon"
- />
- </RelativeLayout>
- <TextView
- android:id="@+id/view2"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="需要光临第二个Tab"/>
- <TextView
- android:id="@+id/view3"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="需要光临第三个Tab"/>
- <TextView
- android:id="@+id/view4"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- />
- </FrameLayout>
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- </TabWidget>
- </LinearLayout>
- </TabHost>
还有一个在类中设置,设置都差不多,在此类中设置只是针对每个Tab页面的设置
- package com.woclub.tabactivitytest;
- import android.app.Activity;
- import android.view.Gravity;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.RadioButton;
- import android.widget.RadioGroup;
- import android.widget.TabHost;
- import android.widget.TextView;
- /**
- * 此类的功能是设置每个Tab标签的布局方式
- * 使用方法
- * CustomLayout ct = new CustomLayout(this);
- * tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));
- * @author Administrator
- *
- */
- public class CustomLayout
implements TabHost.TabContentFactory{ - private Activity myActivity;
- private LayoutInflater layoutHelper;//用于实例化布局
- private LinearLayout layout;
- //构造函数,从外面传递参数Activity
- public CustomLayout(Activity myActivity)
- {
- this.myActivity = myActivity;
- //通过getLayoutInflater从Activity中得到一个实例化的LayoutInflater
- layoutHelper = myActivity.getLayoutInflater();
- }
- /**
- * 根据不同的Tab创建不同的视图
- */
- @Override
- public View createTabContent(String tag) {
- // TODO Auto-generated method stub
- return addCustomView(tag);
- }
- /**
- * 根据Tab的id设置不同Tab的view
- * 这是普通的设置方式,设置每个Tab的布局
- * @param id
- * @return
- */
- private View addCustomView(String id)
- {
- layout = new LinearLayout(myActivity);
- layout.setOrientation(LinearLayout.HORIZONTAL);
- if(id.equals("Tab1"))
- {
- ImageView iv = new ImageView(myActivity);
- iv.setImageResource(R.drawable.chat);
- //设置layout的布局,将一个ImageView添加到其中,并设置ImageView的布局格式,addView的第二个参数是设置ImageView的width和Height
- layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
- }
- else if(id.equals("Tab2"))
- {
- //第一个控件,注意每添加一个空间都需要用addView添加到layout中
- EditText edit = new EditText(myActivity);
- layout.addView(edit, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- //第二个控件
- Button button = new Button(myActivity);
- button.setText("确定");
- button.setWidth(100);
- layout.addView(button, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- //第三个控件
- RadioGroup rGroup = new RadioGroup(myActivity);
- rGroup.setOrientation(LinearLayout.HORIZONTAL);
- RadioButton radio1 = new RadioButton(myActivity);
- radio1.setText("Radio A");
- rGroup.addView(radio1);
- RadioButton radio2 = new RadioButton(myActivity);
- radio2.setText("Radio B");
- rGroup.addView(radio2);
- layout.addView(rGroup,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- }
- else if(id.equals("Tab3"))
- {
- TextView text = new TextView(myActivity);
- text.setText("the third TextView");
- text.setGravity(Gravity.CENTER);
- layout.addView(text);
- }
- else if(id.equals("Tab4"))
- {
- LinearLayout.LayoutParams param3 =
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
- //在这里面又引用了布局文件来设置控件
- layout.addView(layoutHelper.inflate(R.layout.hello,
null),param3); - }
- return layout;
- }
- }
好了,该说的都在代码中说明了
希望大家喜欢,做的粗糙,就由大家去改进吧!
呵呵!
欢迎大家的讨论
转:http://hao3100590.iteye.com/blog/974343
TabActivity中的Tab标签详细设置的更多相关文章
- HTML中的<select>标签如何设置默认选中的选项
方法有两种. 第一种通过<select>的属性来设置选中项,此方法可以在动态语言如php在后台根据需要控制输出结果. 1 2 3 4 5 < select id = " ...
- c# webConfig中的session超时详细设置
webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 ses ...
- 在Bootstrap开发中解决Tab标签页切换图表显示问题
在做响应式页面的时候,往往需要考虑更多尺寸设备的界面兼容性,一般不能写死像素,以便能够使得界面元素能够根据设备的不同进行动态调整,但往往有时候还是碰到一些问题,如Tab标签第一页面正常显示,但是切换其 ...
- head中的base标签:设置超链接的默认行为
默认情况下,如果不指定超链接的target属性,则在当前窗口打开.使用head中的base可以制定超链接的base类,一切超链接都会继承它的属性. <html> <head> ...
- React Native 系列(九) -- Tab标签组件
前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...
- QTabWidget 中 关于Tab 关闭和添加的基本教程!
QTabWidget是PyQt5 中使用较为广泛的容器之一,经常会在日常使用的软件中用到它:QTabwidget是由几个标签组成,每个标签可以当作一个界面,下面就是应用Qtabwidget的一个简单例 ...
- [转]Form中控制Tab画布不同标签间切换的方法
转自:http://yedward.net/?id=68 Form中一般常用的画布类型包括content.stacked.tab这三种,其实content类型的画布是每一个form都必须有的,而且只能 ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 转:设置Eclipse中的tab键为4个空格的完整方法
from: https://my.oschina.net/xunxun10/blog/110074 设置Eclipse中的tab键为4个空格的完整方法 收藏 XunXun10 发表于 4年前 阅读 ...
随机推荐
- ZJNU 1333 - 第二题 blocks--中高级
因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Writ ...
- Tensorflow学习教程------下载图像识别模型inceptionV3
# coding: utf-8 import tensorflow as tf import os import tarfile import requests #inception模型下载地址 in ...
- tif图片压缩
tif图片在ImageIo.read获取时,返回为空,导致无法使用,百度了很久,很多人说jai可以,便去看了下,总结如下: public static void CompressPic(String ...
- JVM(三)内存结构图
JVM内存结构图:
- CSS公共样式模版
CSS文件命名为global.css,一般此CSS文件是用于装全站主要框架CSS样式代码和初始化的CSS样式. 通常会放初始化CSS代码如下: body, div, ul, ol, dl, dt, d ...
- nips2014下载
nips2014下载 wget http://papers.nips.cc/book/advances-in-neural-information-processing-systems-27-2014 ...
- java第三方工具包
--搜集于网络 1.Apache POI 处理office文档用到的2. IText PDF操作类库 3.Java Base64 Base64编码类库 4.Commons-lang 对应java sd ...
- day50-线程-定时器
#1.定时器: from threading import Timer def func(): print('定时器') t = Timer(1,func) #定时一秒,开启func线程. t.sta ...
- 使用node 做静态文件服务器
# 1. 使用server-static 包 使用node可以非常快速的方法把指定目录共享出去 前提条件:安装了node,附带有npm 要托管的文件目录为 /root/www # 先创建一个目录用来存 ...
- 八、linux-mysql的mysql主从复制原理和实战
1.mysql主从复制介绍 mysql支持单向.双向.链式级联.实时.异步复制,在复制过程中,一台服务器充当主服务器(Master),而一个或多个其它服务器充当从服务器(Slave). 复制:单向同步 ...