文档章节

TabHost布局容器

c
 chuiyuan
发布于 2014/05/10 21:50
字数 1274
阅读 156
收藏 1

   一。理论

 标签页主要 由两个部分组成 :

  --  TabActivity 

  -- TabHost -------->TabSpec (标签名和显示内容)

每一个标签 的内容 可以由XML产生,也可以由 TabFactory产生。标签页的布局使用 FrameLayout 。

布局文件如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:id="@+id/tabcontent">

    <LinearLayout
        android:id="@+id/tab1"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="tab1" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/tab2"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="tab2" />

        <AnalogClock
            android:id="@+id/analogClock1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

</FrameLayout>

    使用TabActivity要下面的几个步骤:

(1)继承TabActivity

(2)获得 TabHost  对象 

     在TabActivity 父类  中已经完成 了TabHost  的创建 ,我们只用

this.getTabHost();

得到 TabHost 对象 ;

(3)实例 化布局对象 

我们对布局的实例化,两步完成

1 .获得  LayoutInfalter 

使用  LayoutInflater.from(this )获得  inflater 对象 

LayoutInflater  inflater = LayoutInflater.from (this );

2. 使用 LayoutInflater 实例 化布局

    实例 化布局 在每个 Activity 中都要进行,这些 工作都一般是由  setContentView() 完成 的,但是在TabActivity 中,

我们不要调用 这个 方法,所以要自己来实例 化布局。我们用

LayoutInflater.inflater (int resource ,ViewGroup root);

root: 视图容器类,ViewGroup  对象 。这里为  TabHost.getTabContentView();

(4)创建并设置 TabSpec对象 

首先创建 一个新的 TabSpec 对象 

TabHost.newTabSpec (String tag);

其中tag 是 TabSpec   的标签 ,在显示 的时候 没有什么用。

再设置标签头,如果只要用文字 ,则可以 用

TabSpec .setIndicator (CharSequence label );

如果 同时 用文字 和图片,则用

TabSpec.setIndicator (CharSequence label , Drawable icon );

    最后,设置要显示 的内容 。如果 是xml 定义 的视图,则用

TabSpec.setContent (int viewId);

如果 使用 TabContentFactory ,则用

TabSpec.setContent (TabContentFactory contentFactory );

(5)向TabHost 中添加 TabSpec  完成 标签 页的使用

    添加 TabSpec 的工作类似 于 setContentView() ,只有向TabHost 中添加 了  TabHost  才能正确显示内容 。

TabHost.addTab (TabSpec tabSpec );

还可以设置程序 打开时显示的页面,

TabHost.setCurrentTab(int index);

setCurrentTab(); 故明思意,就是设置当前tab指向哪个Tab的意思.

clearAllTabs();故明思意,就是清空Tab的意思.

这两个合起来应用可以实现很有趣的效果.就是实现,tab的动态更新.

一般setCurrentTab()会用两次,第一次默认用setCurrentTab(0);第二次用自己的INDEX;

二。java  程序 

public class TabDemo extends TabActivity {
	TabHost mTabHost ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.tab_demo);
		mTabHost = this.getTabHost();
		
		LayoutInflater inflater = LayoutInflater.from(this);   //获得  inflater 对象 
		inflater.inflate(R.layout.tab_demo, mTabHost.getTabContentView());  //实例 化布局
		
		TabSpec spec1 =mTabHost.newTabSpec("tab1").setIndicator("tab1").setContent(R.id.tab1);
		//创建 TabSpec 对象 
		TabSpec spec2 = mTabHost.newTabSpec("tab2").
				setIndicator("tab2",getResources().getDrawable(R.drawable.a))
				.setContent(R.id.tab1);
		TabSpec spec3 =mTabHost.newTabSpec("tab3").setIndicator("tab3").setContent(R.id.tab2);
		TabSpec spec4 =mTabHost.newTabSpec("tab4")
				.setIndicator("tab4", getResources().getDrawable(R.drawable.a1))
				.setContent(R.id.tab2);
		
		mTabHost.addTab(spec1);
		mTabHost.addTab(spec2);
		mTabHost.addTab(spec3);
		mTabHost.addTab(spec4);
		
	}





                 接下来是自定义 TabHost  

一。XML  文件写法

步骤:

(1)在  xml 文件中创建 TabHost 节点 ,其 id 设置一定是 tabhost ,这个 是系统 定义 的,下同。

(2)创建 TabWidget 子节点 ,设置 id 为  tabs

(3)创建 FrameLayout 子节点 ,用于显示内容 ,其 id 为 tabcontent .

二。java 文件的步骤 

    使用 TabHost 与TabActivity 时比较相似,不同的只有开始 的两个步骤 :

(1)使用  setContentView( )方法显示界面 。

(2)TabHost 对象 的获得,并设置。

mTabHost =(TabHost) findViewById(android.R.id.tabhost);

注意的是,在之后还要

TabHost.setup();

    这样 才设置完成 ,可以使用。这个 步骤 在TabActivity 中不用,因为在getTabHost() 中已经完成 设置的工作。

(3)创建 并设置 TabSpec 对象 

(4)向TabHost 中添加 TabSpec。

与使用 TabActivity  相比 ,自定义 TbHost时,不用再继承 TabActivity了。

但是要实现 TabCotentFactory 接口,里面的一个方法是

public View createTabContent (String args0);


三。例子

   (1)XML文件

 TabHost 中,tab 默认是在最上面 ,如果 想放在最下面,则如下图的结构 

其中,TabWidget 与 FrameLayout是同级的。这个 时候 ,tab 是在最下面,只在调换位子 ,就是默认的情况 。

但是当 tab 在最下面的时候 ,我们一定要给FrameLayout 设定 android:layout_weight="1"。要不然标签 就不能正确 的显示。

图中tab4没的出现 ,因为我们准备动态实现 、

(2)  java 程序 

public class TabDemo extends Activity implements TabContentFactory {
	private TabHost mTabHost ;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.tabdemo);
		
		mTabHost=(TabHost)findViewById(android.R.id.tabhost);
		mTabHost.setup();
		
		TabSpec spec1 = mTabHost.newTabSpec("tab1").setIndicator("tab1").setContent(R.id.tab1);
		TabSpec spec2= mTabHost.newTabSpec("tab2").setIndicator("tab2").setContent(R.id.tab2);
		TabSpec spec3=mTabHost.newTabSpec("tab3").setIndicator("tab3").setContent(R.id.tab3);
		TabSpec spec4= mTabHost.newTabSpec("tab4").setIndicator("tab4").setContent(this);
		
		mTabHost.addTab(spec1);
		mTabHost.addTab(spec2);
		mTabHost.addTab(spec3);
		mTabHost.addTab(spec4);
		
		mTabHost.setCurrentTab(1);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.tab_demo, menu);
		return true;
	}

	@Override
	public View createTabContent(String tag) {
		// TODO Auto-generated method stub
		TextView tv= new TextView(this);
		tv.setText("from tabcontentFactory");
		tv.setTextSize(25);
		LinearLayout ll = new LinearLayout(this);
		ll.addView(tv);
		return ll;
	}

}


(3)如果 我们的标签 显示 是一个Activity  

    则此时我们要TabHost 中要继承 GroupActivity 。跳转的Activyt 还是继承 Activity .同时 ,加入 

mTabHost.setup(this.getLocalActivityManager());


TabSpec spec3=mTabHost.newTabSpec("tab3").setIndicator("tab3").setContent(new Intent(this, tab3.class));


(4)更改tab 的高度

在onCreate()中调用 setParams ()方法

private void setParam() {
		// TODO Auto-generated method stub
		int count=0;
		TabWidget tabWidget =mTabHost.getTabWidget();  //得到TabWidget对象 
		count= tabWidget.getChildCount();
		DisplayMetrics dm = new DisplayMetrics ();
		getWindowManager().getDefaultDisplay().getMetrics(dm);  //获得屏幕参数 
		
		int screenWidth = dm.widthPixels;
		int screenHeight= dm.heightPixels;
		
		if (count>0){
			for(int i=0;i<count;i++){
				tabWidget.getChildTabViewAt(i).getLayoutParams().width=screenWidth/4;
				tabWidget.getChildTabViewAt(i).getLayoutParams().height=(screenHeight-40)/12;
			}
		}

	}



© 著作权归作者所有

共有 人打赏支持
c
粉丝 9
博文 92
码字总数 40993
作品 0
海淀
【android基础学习之八】——页面布局

声明:学习的书籍《Android应用开发揭秘》,这里记录学习该书籍的日志,引用的相关代码与总结描述,没有商业的用途,完全是自我学习的一个记录,刚刚学习不可避免会出现很多问题,若是有错误...

晨曦之光
2012/03/08
834
0
史上最全的Android的Tab与TabHost讲解

Tab与TabHost 这就是Tab,而盛放Tab的容器就是TabHost 如何实现?? 每一个Tab还对应了一个布局,这个就有点好玩了。一个Activity,对应了多个功能布局。 ①新建一个Tab项目,注意,不要生成...

无鸯
2011/09/27
28.8K
8
杂文---总结几天学的东西

一、Gallery学习、看懂Logcat的提示信息 看实际错误的第一句,像这句错误提示:android.widget.Gallery$LayoutParams,可以看出与Gallery有关的布局参数可能出错了,所以你定位错误的大致方向...

ctozhong
2014/05/12
0
0
Android界面开发之切换卡TabWidget用法

TabWidget类似Android中查看电话簿的界面,通过多个标签切换显示不同的内容。要实现这一效果,首先要了解TabHost ,它是一个用来存放多个Tab标签的容器。每一个Tab都可以对应自己的布局,比如...

鉴客
2011/11/22
28K
5
Android 分页控件制成底部菜单.

其实Android 中的底部菜单, 可以用分页控件很好的实现。 我们先将自定义分页控件做好, 就可以做到顶底两个位置的菜单了。 TabHost只是作为一个容器来存放一些Activity, 所以需要自己另外创...

鉴客
2011/12/13
4.3K
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

获取多个集合列表的笛卡尔积

获取多个集合笛卡尔积 电商中典型业务场景:商品搜索 单属性属性值之间为并查询 不同属性的属性值之间查询为与查询 import java.util.ArrayList;import java.util.List;/** * Created w...

键走偏锋
17分钟前
0
0
echarts 迁移地图 控制鼠标缩放大小比例

在网上找了好久没有找到解决方式,还是重新看了一下文档,终于找到的解决方案, zoom:1, //默认显示级别 scaleLimit:{min:1,max:3}, // 缩放级别 echarts 文档-配置项链接 http://echarts.b...

心驰
21分钟前
0
0
Boot2Docker ISO is out-of-date,

Boot2Docker ISO is out-of-date, downloading the latest release. 使用docker-machine时无法更新Boot2Docker ISO导致创建vm machine失败 解决方法:关闭网络,创建好之后再开启...

writeademo
29分钟前
0
0
在 Tomcat 中设置 Tapestry 框架的 html 热加载

如果开发中使用到了 Tapestry 这个框架,如果事先没有设置过的话,开发的时候 html 是不会热加载的,也就是说修改了 html 文件,不能刷新浏览器后立马看到修改完的效果,必须先重新启动应用服...

LeoXu
51分钟前
0
0
【微服务】开启巨石应用到微服务的探索

背景 在过去的一年时间里,我一直在从事一件事情,将现有的单体应用(巨石应用)向微服务改造。 接下来,将持续整理一些在微服务路上的学习与成长。 为什么要做微服务 单体应用,开发、部署简...

艳沐石
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部