`
gryphone
  • 浏览: 433713 次
  • 性别: 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显示超级难看

相关推荐

    TabActivity中的Tab标签详细设置

    在Android开发中,TabActivity是早期用来实现底部标签栏切换页面的一种方式,它结合了TabHost和ActivityGroup来实现多页面间的切换。然而,随着Android版本的更新,TabActivity已经逐渐被Fragment和ViewPager等组件...

    Fragment + TabActivity实现标签内跳转

    在Android应用开发中,"Fragment + TabActivity实现标签内跳转"是一种常见的界面设计模式,它使得用户可以在同一个界面上通过不同的Tab切换查看不同的内容。TabHost是Android系统提供的一个用于实现标签页功能的组件...

    Postern-3.1.3,https抓包工具,兼容Android14+

    Postern-3.1.3,https抓包工具,兼容Android14+,解决了:Failure [INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 16] 的安装错误问题。...使用教程参见:...

    使用 TabActivity 实现滑动翻页(带动画)和标签置底

    在Android开发中,`TabActivity`是早期版本中用于实现标签栏切换的一种方式,它可以创建一个带有多个选项卡的活动,每个选项卡对应一个单独的`Activity`或`Fragment`。然而,`TabActivity`在Android API Level 13...

    TabActivity自定义实现标签换页

    在Android开发中,`TabActivity`是早期版本中用于实现标签栏切换页面的一种方式。它允许用户通过点击不同的标签在多个视图之间进行切换,提供了一种直观且友好的用户界面。然而,随着Android SDK的发展,`...

    TabActivity笔记

    在Android开发中,`TabActivity`是早期版本中用于实现底部标签栏切换界面的一种方式。这篇笔记主要探讨了`TabActivity`的使用方法及其背后的原理,同时也涉及到了一些与之相关的工具和源码分析。 首先,`...

    TabActivity之间跳转、传值

    在Android应用开发中,`TabActivity`是一种常见的用于创建多标签界面的设计模式。它允许用户在不同的标签之间切换,每个标签通常对应一个独立的功能模块。然而,随着Android SDK的更新,`TabActivity`已被废弃,...

    用Fragment模拟TabActivity

    在Android应用开发中,`TabActivity`曾是实现标签页切换的主要方式,但自API 17之后,它已被弃用。现在,开发者通常使用`Fragment`和`ViewPager`等组件来实现类似的功能,这既符合最新的Android设计指南,也能提供更...

    TabActivity的使用

    在Android开发中,`TabActivity`是早期API版本中用于实现多标签页切换的一种方式。本文将深入探讨`TabActivity`的使用,以及如何通过源码理解和应用它,同时也会介绍一些相关的工具来辅助开发。 `TabHost`是`...

    ActivityGroup 代替TabActivity的用法

    此外,TabActivity 还存在强制依赖关系,它的布局文件必须将TabHost 作根标签,并且 id 必须为"@android:id/tabhost",必须有 TabWidget 标签,且它的 id 必须是"@android:id/tabs",还有加载 Activity 的 View 容器...

    TabActivity

    `TabActivity`结合了`TabHost`和`TabWidget`,使得开发者能够方便地构建这种多标签的布局。 首先,我们来详细了解一下`TabHost`。`TabHost`是Android框架中的一个类,它用于管理一个或多个`TabWidget`和一个`...

    Obfuscation.sh,ollvm移植到LLVM10.0.1以及更高版本的脚本

    Obfuscation.sh,Obfuscation移植到LLVM10.0.1以及更高版本的脚本,使用方法:https://blog.csdn.net/tabactivity/article/details/108995746

    make_ext4fs,linux下system.img打包工具

    make_ext4fs,linux下system.img打包工具 使用教程参见: https://blog.csdn.net/tabactivity/article/details/125993855

    TabActivity 实现滑动翻页源码

    接下来,在`TabActivity`的初始化代码中,我们需要为每个选项卡设置标签和对应的`Intent`: ```java TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost); tabHost.setup(); TabSpec tab1 = tabHost....

    切换卡TabActivity的使用

    1.2 添加Tab,并为每个Tab指定对应的Intent和标签: ```java TabSpec spec1 = tabHost.newTabSpec("tab1"); spec1.setIndicator("Tab1", getResources().getDrawable(R.drawable.tab_icon1)); spec1.setContent(new ...

    TabActivity 分页 使用

    在Android开发中,TabActivity是早期用于实现分页视图的一种方式,它允许用户通过不同的Tab切换不同的页面。本文将详细讲解如何在Android应用中使用TabActivity实现分页功能,并结合源码分析其工作原理。 首先,让...

    Android TabActivity实现多页显示效果

    在TabActivity中,我们需要设置TabHost并添加对应的TabSpec(标签规范),每个TabSpec对应一个页面或Activity。 1. **初始化TabHost** - 在布局XML文件中,为TabHost定义一个根元素`&lt;TabHost&gt;`,并设置其ID为`...

    TabActivity使用实例

    在Android开发中,`TabActivity`是早期用来实现底部标签栏切换页面的一种方式。随着Android SDK的更新,`TabActivity`已经被废弃,取而代之的是`Fragment`和`ViewPager`的组合,以及Google推出的`TabLayout`与`...

    super.img解包打包工具-lpunpack、lpmake、lpdump

    super.img解包打包工具--lpunpack、lpmake、lpdump linux 下可用。 解压密码:https://modun.blog.csdn.net/ 使用说明:参见我的文章 https://blog.csdn.net/tabactivity/article/details/135969964?

Global site tag (gtag.js) - Google Analytics