`
gryphone
  • 浏览: 438043 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

标签/TabActivity 深度研究

阅读更多

何谓标签 印象最深刻的应该是这个

 

 

 

 

现在 我们将通过一系列的扩展来研究之

写道
1. 自定义TabActivity 使得标签处于屏幕下方
2. 各个标签所用布局 既可在 *.xml 中定义 也可在 *.java 中定义
3. 更改标签布局

 

 

1. 标签页 在 屏幕下方

写道
一个典型的标签Activity  是由2 部分构成的 且其id都有规定 即:
* TabWidget 用于展示标签页 id=tabs
* FrameLayout 用于展示隶属于各个标签的具体布局 id=tabcontent

 

* 基本布局如下:

<?xml version="1.0" encoding="utf-8"?>
<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/text"
    		android:layout_width="wrap_content" 
    		android:layout_height="wrap_content" 
    		android:text="Hello to Johnny.Griffin!"
    		android:layout_centerInParent="true"
    		android:textStyle="bold|italic" />
		<ImageView  
    		android:layout_width="fill_parent" 
    		android:layout_height="fill_parent" 
    		android:src="@drawable/robot"
    		android:layout_toLeftOf="@id/text" />
	</RelativeLayout>
	
	<TextView
		android:id="@+id/view2"
		android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:text="创新源于模仿!" />
    	
    <TextView
		android:id="@+id/view3"
		android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:text="欢迎进入 droid 世界!" />
    	
    <ImageView
		android:id="@+id/view4"
		android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:src="@drawable/robot" />
</FrameLayout>
<TabWidget   
	android:id="@android:id/tabs" 
	android:layout_width="fill_parent"   
	android:layout_height="wrap_content" />   
</LinearLayout>   
</TabHost> 

 

 

* 得到TabHost tHost 仅在TabActivity中有效

tHost = this.getTabHost();

 

 

* 创建4个标签 并指定所使用的布局

public static final String Tab1 = "Tab1";
public static final String Tab2 = "Tab2";
public static final String Tab3 = "Tab3";
public static final String Tab4 = "Tab4";
public static final String Tab5 = "Tab5";

tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("Tab 1", getResources().getDrawable(R.drawable.icon)).setContent(R.id.view1));
        tHost.addTab(tHost.newTabSpec(Tab2).setIndicator("Tab 2", getResources().getDrawable(R.drawable.beijing_small)).setContent(R.id.view2));
        tHost.addTab(tHost.newTabSpec(Tab3).setIndicator("Tab 3").setContent(R.id.view3));
        tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(R.id.view4));

 

 

* 设定监听器 用于监听 标签间切换事件

tHost.setOnTabChangedListener(new OnTabChangeListener(){
			@Override
			public void onTabChanged(String tabId) {
				// TODO Auto-generated method stub
			}
        	
        });

 

 

* emulator 运行情况:

 

 

 

 

2.  在 *.java 中定义标签所需布局

 

 

public class CustomLayout implements TabHost.TabContentFactory  {
    	Activity activity;
    	LayoutInflater inflaterHelper;
    	
    	LinearLayout layout;
    	
    	public CustomLayout (Activity a) {
    		activity = a;
    		
    		inflaterHelper = a.getLayoutInflater();
    	}
    	
    	/** {@inheritDoc} *///tag 标记各个标签
        public View createTabContent(String tag) {
        		return addCustomView(tag);
        }
        
        public View addCustomView(String id){
        	
        	layout = new LinearLayout(activity);
            layout.setOrientation(LinearLayout.VERTICAL);
            
            
            if(id.equals(Tab1)){
                ImageView iv = new ImageView(activity);
                iv.setImageResource(R.drawable.beijing_big);
                layout.addView(iv,
                		new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
            }
            else if(id.equals(Tab2)){
                EditText edit = new EditText(activity);
                layout.addView(edit,
                		new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
                
                Button btn = new Button(activity);
                btn.setText("OK");
                btn.setWidth(100);
                layout.addView(btn,
                		new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
                
                RadioGroup rGroup = new RadioGroup(activity);
                rGroup.setOrientation(LinearLayout.HORIZONTAL);
                RadioButton radio1 = new RadioButton(activity);
                radio1.setText("Radio A");
                rGroup.addView(radio1);
                RadioButton radio2 = new RadioButton(activity);
                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)){
            	
            	LinearLayout.LayoutParams param3 =
                    new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
            	
                layout.addView(inflaterHelper.inflate(R.layout.hello, null),param3);
            }
            else if(id.equals(Tab4)){
            	TextView tv = new TextView(activity);
            	tv.setText("HelloTags!");
            	tv.setGravity(Gravity.CENTER);
            	layout.addView(tv);
            }

            return layout;
        }
        
    }

 

 

* 如何使用:

CustomLayout ct = new CustomLayout(this);

tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));

 

 * emulator 运行结果:

 

 

 

3. 改变标签布局

 

写道
可能很多人对TabActivity 不满意 原因之一:其很不美观 而不美观的根源就是:标签的问题 其图像和文字相互覆盖 导致的


那么 我们可以自己扩展么? 当然

 

 

写道
TabWidget 理解:

1. TabWidget 为 horizontal 的 LinearLayout
2. 且 其包含的标签又是一个RelativeLayout
3. 每个标签RelativeLayout 里面包含2个View: TextView ImageView

 

 

因此 我们甚至可以推算出其布局为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<RelativeLayout
	android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
	<ImageView  />
    <TextView  />
</RelativeLayout>
<RelativeLayout
	android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
	<ImageView  />
    <TextView  />
</RelativeLayout>
<RelativeLayout
	android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
	<ImageView  />
    <TextView  />
</RelativeLayout>
<RelativeLayout
	android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
	<ImageView  />
    <TextView  />
</RelativeLayout>
</LinearLayout>

 

 

* 去掉系统默认的布局 即 在 setIndicator() 中置空 修改如下:

tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("").setContent(ct)); 

 

写道
可能有人会说:那我不调用setIndicator() 不久可以了么 不行 否则 会报错

 

 

* 自己定义布局 并 指定显示的内容

public View composeLayout(String s, int i){
    	LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        
        TextView tv = new TextView(this);
        tv.setGravity(Gravity.CENTER);
        tv.setSingleLine(true);
        tv.setText(s);
        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;
    }

 

 

* 得到 TabWidget 实例 tw

LinearLayout ll=(LinearLayout)tHost.getChildAt(0); 
        tw =(TabWidget)ll.getChildAt(1);

 

 

* 得到 TabWidget 内的具体某个Layout 并使用上面的布局 composeLayout()

public void updateWidgetView(int i,String text,int image){
    	RelativeLayout rl =(RelativeLayout)tw.getChildAt(i);
    	
    	rl.addView(composeLayout(text,image));
    }

 

 

* emulator 运行截图 // 前面 3个是使用新布局 最后一个是使用TabActivity 默认的布局 哪个好看 大家自己选择之

 

 

that's all!

 

 

分享到:
评论
13 楼 zhoujianghai 2010-09-01  
LinearLayout ll=(LinearLayout)tHost.getChildAt(0);  
        tw =(TabWidget)ll.getChildAt(1); 
lz,这句tw =(TabWidget)ll.getChildAt(1);应该是tw =(TabWidget)ll.getChildAt(0)吧,
xml结构是这样子的吧:<TabHost>
<LinearLayout>
<TabWidget />
<FrameLayout>
<LinearLayout/>
</FrameLayout>
</LinearLayout>
</TabHost>
12 楼 javetu_7 2010-07-04  
假如总共有5个标签,但显示时每次显示3个,剩下2个通过拖动方式进入当前显示界面该如何实现
11 楼 gryphone 2010-06-14  
darrendu 写道
你改进的TabWidget怎样改进啊?把你推算的代码发到<TabWidget>标签内吗?

应该这么说:
1. 去除默认的布局
2. 追加定制化布局
10 楼 darrendu 2010-06-14  
你改进的TabWidget怎样改进啊?把你推算的代码发到<TabWidget>标签内吗?
9 楼 chenjuncong 2010-06-01  
yuankai 写道
有N个tab显示超级难看

我现在有四个tab,但每个tab里的字都不能完全显示出来,除了把字体调小,在用tab的基础上还有没有其他的办法,像控制tab的间距。
各位发表,谢~
8 楼 yzhong_sa 2010-05-08  
建议不要用tab,直接自己实现一条bar,然后处理点击每个item的事件就是了。。
7 楼 yuankai 2010-05-07  
tab.removeView(view)
6 楼 wangchao20062896 2010-05-06  
通过addtab可以动态添加切换卡 但是怎么关闭某个特定的切换卡呢?
5 楼 CmdMac 2010-03-17  
找了好久 终于找到了 谢谢楼主分享。。。
4 楼 yuanyao 2010-03-03  
考虑如果这样的话,软件的移植会不会有问题.
3 楼 springfield 2010-03-01  
根据实际需求吧,反正我觉得通常的需求都不会要求太多的Tab,就像上面那个拨号的,如果过多的话就不用Tab了。
2 楼 gryphone 2010-02-27  
yuankai 写道
有N个tab显示超级难看

对的 我的方法也仅仅是稍微好点而已 其实如果Tab太多的话 建议使用Gallery + FrameLayout 会更好点 然否?
1 楼 yuankai 2010-02-26  
有N个tab显示超级难看

相关推荐

    android应用合集

    接下来,"TabActivity 深度研究.doc"文档可能详细介绍了Android中的TabActivity,这是一种常见的多页面导航模式。TabActivity允许用户通过标签页在不同的视图之间切换,通常与TabHost和TabWidget组件一起使用。不过...

    基于MATLAB GUI的学生成绩管理系统:功能实现与应用

    内容概要:本文介绍了一款基于MATLAB GUI的学生成绩管理系统,旨在提升学校教学管理的效率和准确性。系统主要由三个模块组成:考试收录数据模块、考试数据分析模块和统计分析数据模块。它不仅支持成绩的录入、显示、排序、查找,还包括特征值分析、直方图绘制和教师评语录入等功能。通过对成绩数据的综合分析,系统能为学校教学管理提供客观科学的数据支持。 适合人群:教育工作者(如教师、管理人员)和技术爱好者(特别是对MATLAB GUI感兴趣的开发者)。 使用场景及目标:适用于各类学校和教育机构,用于管理和分析学生成绩,帮助教师和管理者更好地了解学生的学习状况,改进教学质量。 阅读建议:对于希望深入了解如何利用MATLAB GUI进行学生成绩管理的读者来说,本文提供了详细的系统设计思路和功能实现方法,值得仔细研读并尝试实践。

    基于T-Mats库的涡扇发动机气路故障仿真模型:自定义故障植入与真实运行扰动分析

    内容概要:本文介绍了基于T-Mats库的涡扇发动机气路故障仿真模型,涵盖了多种类型的故障植入(如部件流量、效率及压比故障),并允许自定义故障程序和组合。该模型通过对软阈值去噪处理后的信号序列进行分析,提取真实的运行扰动信息,确保输出数据符合CMAPASS的排列要求。此外,该模型能够模拟航空发动机的典型气路故障,帮助研发和技术人员更准确地预测和评估发动机性能,从而提前采取预防措施。 适合人群:航空航天领域的研发人员、技术人员以及对航空发动机故障仿真感兴趣的学者。 使用场景及目标:①用于研究和开发涡扇发动机的气路故障诊断系统;②辅助工程师进行故障预测和性能评估;③为后续数据分析和实验验证提供可靠的数据基础。 其他说明:该模型不仅提高了仿真的准确性,还增强了对发动机运行状态的理解,为提升发动机性能和可靠性提供了强有力的技术支持。

    scratch少儿编程逻辑思维游戏源码-scratch冒险.zip

    scratch少儿编程逻辑思维游戏源码-scratch冒险.zip

    少儿编程scratch项目源代码文件案例素材-爬塔.zip

    少儿编程scratch项目源代码文件案例素材-爬塔.zip

    合金凝固模型中的相场模拟与各向异性枝晶生长研究及其在激光增材制造中的应用

    内容概要:本文详细探讨了合金凝固模型中的相场模拟方法及其在各向异性枝晶生长研究中的应用。首先介绍了合金凝固模型的基本概念及其在现代制造业中的重要性,特别是在激光增材制造、选择性激光熔融和定向凝固技术中的应用。接着,重点讨论了相场模拟作为一种数值模拟方法,在预测合金凝固过程中组织结构演变方面的关键作用。文中还提供了MATLAB实现合金各向异性枝晶生长的具体代码及详细注释,以及Comsol用于偏微分方程求解的雪花生长模型。最后,文章总结了当前的研究进展,并展望了未来的发展趋势。 适合人群:从事材料科学、冶金工程、激光增材制造领域的研究人员和技术人员,尤其是对相场模拟和合金凝固感兴趣的学者。 使用场景及目标:适用于希望深入了解合金凝固过程、相场模拟方法及其在现代制造技术中应用的专业人士。目标是提高对合金凝固机制的理解,优化制造工艺,提升产品质量。 其他说明:文章不仅提供了理论分析,还包括具体的代码实现和详细的文献参考资料,有助于读者全面掌握相关技术和最新研究进展。

    少儿编程scratch项目源代码文件案例素材-史莱姆出击.zip

    少儿编程scratch项目源代码文件案例素材-史莱姆出击.zip

    少儿编程scratch项目源代码文件案例素材-忍者酷跑.zip

    少儿编程scratch项目源代码文件案例素材-忍者酷跑.zip

    scratch少儿编程逻辑思维游戏源码-点击灌篮.zip

    scratch少儿编程逻辑思维游戏源码-点击灌篮.zip

    基于RBF神经网络的PID控制器在PMSM转速环中的Simulink模型设计与性能分析

    内容概要:本文介绍了将基于RBF神经网络的PID控制器应用于永磁同步电机(PMSM)转速环控制的方法及其性能优势。传统的PID控制器在面对非线性和时变系统时存在参数整定困难的问题,而引入RBF神经网络可以实现实时在线调参,提高系统的灵活性和鲁棒性。文中详细描述了Simulink模型的设计,特别是Matlab s-function模块中RBF神经网络的具体实现,包括高斯函数激活和带惯性的权值更新机制。实验结果显示,在转速突变情况下,改进后的控制器能够迅速稳定系统,超调量控制在2%以内,调节时间较传统方法缩短约40%,并且在负载变化时表现出色,无需重新整定参数。 适合人群:从事电机控制系统研究和开发的技术人员,尤其是对PID控制器优化感兴趣的工程师。 使用场景及目标:适用于需要提升PMSM转速环控制精度和响应速度的应用场合,如工业自动化设备、机器人等领域。目标是通过引入智能算法解决传统PID控制器参数整定难题,提高系统性能。 阅读建议:关注RBF神经网络与PID控制器结合的具体实现细节,特别是在Matlab s-function模块中的编码技巧以及参数调整策略。同时,注意学习率的选择和动量项的作用,这对于实际应用至关重要。

    scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip

    scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip

    基于COMSOL有限元仿真的变压器辐射传热数值分析:从入门到进阶

    内容概要:本文详细介绍了基于COMSOL有限元软件的变压器辐射传热数值分析方法。首先,解释了变压器内外辐射传热的基本机理,包括热量通过传导、对流和辐射的方式传递,重点在于辐射传热的作用及其数学描述。接着,逐步引导读者从零开始构建有限元仿真模型,涵盖模型参数确定、网格划分、材料属性定义、边界条件设置、传热方程设定、仿真运行及结果分析等多个步骤。最后,探讨了进一步研究的方向,如不同因素(温度、材料属性、几何形状)对辐射传热的影响,以及该模型在电力电子设备和热管理系统的潜在应用。 适合人群:电气工程专业学生、初学者和技术爱好者,尤其是对有限元仿真和变压器辐射传热感兴趣的群体。 使用场景及目标:适用于希望通过实际操作掌握有限元仿真技能的人群,旨在帮助他们理解变压器辐射传热机制并能独立完成相关仿真项目。 其他说明:本文不仅提供了理论知识,还附带了详细的视频教程和仿真模型,使学习过程更加直观易懂。

    交错并联Boost PFC仿真电路模型:基于双闭环控制的BCM模式优化与应用

    内容概要:本文详细介绍了交错并联Boost PFC(功率因数校正)仿真电路模型的设计与实现,特别是在临界BCM模式下的双闭环控制特性。文章首先解释了该电路的经典结构及其优势,即能够有效降低开关损耗和电流纹波。接着,重点讨论了双闭环控制的具体实现方法,包括外环电压控制和内环电流控制的MATLAB/Simulink代码示例。文中还特别强调了电流环中零交叉检测的重要性以及交错并联结构中驱动信号相位差的精确设置。此外,作者分享了将模型从Simulink转换到Plecs和Psim时遇到的问题及解决方案,如更换为带反向恢复特性的二极管模型和重新校准控制环路的采样周期。最后,文章展示了优化后的电流波形图,验证了所提方法的有效性。 适合人群:电力电子工程师、电源设计师、从事电力系统仿真的研究人员和技术爱好者。 使用场景及目标:适用于需要进行高效电源设计的研究和开发项目,旨在提高电源系统的性能,减少谐波失真,提升功率因数校正效果。 其他说明:文中提供的具体代码片段和参数设置有助于读者更好地理解和复现实验结果。同时,对于希望深入理解双闭环控制系统和BCM模式的人来说,本文提供了宝贵的实践经验。

    scratch少儿编程逻辑思维游戏源码-3000 横版闯过.zip

    scratch少儿编程逻辑思维游戏源码-3000 横版闯过.zip

    空气涡轮发动机Matlab/Simulink动态仿真模型:部件级建模与PID控制应用

    内容概要:本文介绍了如何利用Matlab/Simulink构建空气涡轮发动机的动态仿真模型。首先,文章详细阐述了各个部件级模型的设计,包括进气道、涡轮、气室、压气机、尾喷管、转子动力学模块和容积模块。接着,重点讨论了PID控制器在维持发动机转速恒定方面的作用,尤其是在面对输出扭矩阶跃扰动时的表现。最后,提供了简单的Simulink模型代码片段,展示了如何设置和运行仿真模型,以便实时监控和调整发动机性能。 适合人群:航空航天工程领域的研究人员和技术人员,尤其是那些对空气涡轮发动机仿真感兴趣的读者。 使用场景及目标:适用于希望通过Matlab/Simulink进行空气涡轮发动机仿真研究的专业人士。主要目标是掌握空气涡轮发动机各部件的工作原理及其相互关系,同时学会使用PID控制器优化发动机性能。 其他说明:本文不仅提供了理论知识,还附有实际操作步骤和代码示例,帮助读者更好地理解和应用所学内容。

    少儿编程scratch项目源代码文件案例素材-收集能量.zip

    少儿编程scratch项目源代码文件案例素材-收集能量.zip

    scratch少儿编程逻辑思维游戏源码-弹回的球.zip

    scratch少儿编程逻辑思维游戏源码-弹回的球.zip

    少儿编程scratch项目源代码文件案例素材-铅笔画.zip

    少儿编程scratch项目源代码文件案例素材-铅笔画.zip

    Sage Decrypter.zip

    Sage Decrypter.zip

    scratch少儿编程逻辑思维游戏源码-躲避火箭.zip

    scratch少儿编程逻辑思维游戏源码-躲避火箭.zip

Global site tag (gtag.js) - Google Analytics