修炼-------------Android TabHost,TabWidget选项卡总结

修炼-------------Android TabHost,TabWidget选项卡总结

Android之TabHost

TabHost,个人理解为选项卡的容器,是一种特殊的FrameLayout布局(帧布局)
根据SDK文档,
Container for a tabbed window view. This object holds two children: a set of tab labels that the user clicks to select a specific tab, and a FrameLayout object that displays the contents of that page. The individual elements are typically controlled using this container object, rather than setting values on the child elements themselves。
TabHost主要由两部分组成,标签和内容,其中内容是一个FrameLayout,当用户单击不同的标签可以显示不同的内容。使用标签可以达到分页的效果,是页面的内容更加丰富,更加具有亲和力,当然与此同时,也会增加页面的复杂程度.

一个简单的TabHost布局
1.首先继承TabActivity
2.通过TabActivity的getTabHost()方法得到一个TabHost对象
3.定义选项卡的内容(是一个FrameLayout的对象),并与TabHost绑定起来
可以通过一下语句绑定TabHost容器的内容
LayoutInflater.from(this).inflate(R.layout.main, tabHost.getTabContentView(), true);
4.添加选项卡及设置选项的标题及内容
我们知道添加选项卡需要指定一个TabSpec对象,通过TabHost的newTabSpec(选项卡的标识)可以得到,并且可以设定选项卡的标题(可以设置图片),并且设置选项卡内容,如
  tabHost.addTab(tabHost.newTabSpec("tab01")
  .setIndicator("标签1",getResources().getDrawable(R.drawable.icon))
  .setContent(R.id.tab01));
...
效果图: 

源码: tabtest01.zip (43.15 KB, 下载次数: 4) 

初学者注意了:
如果在 继承了TabActivity的类中设置了,setContentView(R.layout.main),则有可能导致错误,原因可能是因为main布局文件设置不正确(下面有详解),解决办法是建议先删除此行

上面的例子中TabHost只是与一个布局容器绑定,也就是说各个选项卡的内容是写在一个布局文件中的,然后通过不同的id来区分各个选项卡的内容.
如果选项卡的个数过多,或者每个选项卡的布局比较复杂的话,势必会使布局容器显得臃肿而且可读性比较差,不利于后期的维护。
Android中提供了我们还可以通过setContent(Intent intent)来指定每个选项卡的内容
源码: 

有时候我们需要将选项卡的标题设置的更加个性化,虽然我们知道了setIndicator()方法可以设置选项卡的标题的时候可以指定图片,但都是图片在下,文字在图片上方,我们能不能设置成文字在图片下方,或者文字在图片右边呢?
当然可以,android中的setIndicator()方法总共有如下三种形式:
TabHost.TabSpec         setIndicator(CharSequence label)
TabHost.TabSpec         setIndicator(CharSequence label, Drawable icon)
TabHost.TabSpec         setIndicator(View view) 

前两种就不说了,想必现在大家都熟悉了。
主要说说第三种,第三种中,方法的参数是一个View,想必大家想在已经知道一些蹊跷了吧. 好的,废话不多说,
直接上源码
源码:
效果图: tabtest03.zip (51.65 KB, 下载次数: 3) 

Android之TabWidget
上面基本上已经说明了android中TabHost的大部分用法,但还不够。
在开发中,我们有时需要更加实用的TabHost,虽然我们已经可以随心所欲的设置TabHost,但我们一定会发现,在上面的例子中,Label都是在上面,那怎么才能让Label在下面呢?

下面介绍TabWidget
根据SDK文档,
Displays a list of tab labels representing each page in the parent‘s tab collection. The container object for this widget is TabHost. When the user selects a tab, this object sends a message to the parent container, TabHost, to tell it to switch the displayed page. You typically won‘t use many methods directly on this object. The container TabHost is used to add labels, add the callback handler, and manage callbacks. You might call this object to iterate the list of tabs, or to tweak the layout of the tab list, but most methods should be called on the containing TabHost object.

我们可以粗略的理解为TabWidget就是Tab的一个集合,也就是Label栏.

根据上面的初学者注意:
不要随便在设置setContentView(R.layout.main)中,这条语句可能引起错误.
如果设置这条语句的话,那么对main布局文件就要正确的配置.

怎么正确定义main.xml布局文件呢?
首先我们需要搞清楚TabHost,TabWidget,FrameLayout之间的关系,
我们知道TabHost好比一个选项卡的容器,包括多个选项卡和选项卡的内容,其中选项卡的内容是一个FrameLayout容器,TabWidget可以理解为选项卡栏.
正确的main.xml文件应该包含这三个组件TabHost,TabWidget,FrameLayout
并且这三个组件的id 必须为
@android:id/tabhost,@android:id/tabs,@android: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="match_parent"
  android:layout_height="match_parent">
  
  <LinearLayout
          android:orientation="vertical"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent">
          
           <TabWidget  
                   android:id="@android:id/tabs"
                   android:layout_width="fill_parent"
                   android:layout_height="wrap_content">
           </TabWidget>
          
            <FrameLayout
                android:id="@android:id/tabcontent"
         android:layout_width="fill_parent"
         android:layout_height="fill_content"
         android:padding="5dp" />
          
</LinearLayout>
   
</TabHost>
效果图:
使用TabWidget选项卡栏在上方源码: tabtest04.zip (53.09 KB, 下载次数: 1) 

如果想要让选项卡栏在下方,那么只需要交换TabWidget和FrameLayout的位置即可,如
<?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="match_parent"
  android:layout_height="match_parent">
  
  <LinearLayout
          android:orientation="vertical"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent">
          
            <FrameLayout
                android:id="@android:id/tabcontent"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:layout_weight="1.0"
         android:padding="5dp" />
          
           <TabWidget  
                   android:id="@android:id/tabs"
                   android:layout_width="fill_parent"
                   android:layout_height="wrap_content">
           </TabWidget>
          
</LinearLayout>
   
</TabHost>

效果图:
使用TabWidget选项卡栏在下方源码: tabtest05.zip (150.63 KB, 下载次数: 7) 

注意了,FrameLayout中多了一行android:layout_weight="1.0"语句
这个属性代表的是比重,android中所有的组件默认这个属性都是为0,意味着他们只在屏幕上显示他们需要空间的大小。
如果设置了该属性,activity将根据设置的值按比例来划分空间的大小

举个例子,如果acitivity中有三个组件,假设屏幕高为90cm,三个组件如果设置了该属性为0的话,那么他们会以正常的方式显示在屏幕上。
如果第一个组件设置组件设置为0,其余两个组件设置为1,那么这个屏幕将会以0:1:1的方式来显示,如果第一个组件默认占10cm,那么其他两个组件各占40cm
时间: 2024-10-06 05:45:33

修炼-------------Android TabHost,TabWidget选项卡总结的相关文章

android TabHost(选项卡)

1:在布局文件中配置选项卡的内容 <?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="match_parent" and

android之TabWidget选项卡

1 概览 l  TabWidget与TabHost.tab组件一般包括TabHost和TabWidget.FrameLayout,且TabWidget.FrameLayout属于TabHost. l  是否继承TabActivity的问题 l  实现步骤.两种实现方式,一种是将每个Tab的布局嵌在TabHost中的FrameLayout中,每个Tab的内容布局与显示都在FrameLayout中进行,缺点是布局会显得很臃肿:一种是每个Tab从FrameLayout中独立出来,以Activity呈现

Android TabHost切换选项卡实现数据实时刷新

手机界面大小有限,使用TabHost可以达到在一个Activity中放入多个容器(界面)的效果.但存在一个问题是,当数据信息在一个容器(界面)中有所改变时,需要在用户切换选项卡到其他容器(界面)的时候实时刷新数据. 如图,在”发布板报“页面发布新的板报,当用户点击“浏览板报”或者“管理板报”选项卡时要刷新数据——显示出刚刚发布的板报. 解决问题的关键在于对选项卡修改事件的监听,根据Tab ID来调用相应的方法. 核心代码: @Override public void onCreate(Bundl

Android 自学之选项卡TabHost

选项卡(TabHost)是一种非常实用的组件,TabHost可以很方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器相同大小的组建摆放区域.通过这种方式,就可以在一个容器中放置更多组件,例如许多手机系统会在同一个窗口第一多个标签页:来显示通话记录,包括“未接来电”,“已接来电”,“呼出电话”等. TabHost仅仅是一个简单的容器,他提供了如下两个方法来创建选项卡.添加选项卡. newTabSpec(String tag) : 创建选项卡 addTab(TabHost.TabSp

Android:简单实现ViewPager+TabHost+TabWidget实现导航栏导航和滑动切换

viewPager是v4包里的一个组件,可以实现滑动显示多个界面. android也为viewPager提供了一个adapter,此adapter最少要重写4个方法: public int getCount() public boolean isViewFromObject(View view, Object o) public void destroyItem(ViewGroup container, int position, Object object)  public Object in

Android ——TabHost使用

在Android中,通常可以使用切换卡(选项卡)实现切换显示不同页面内容的功能.这一功能可以通过TabHost控件来实现. 下面我们就通过一个简单的实例演示如何使用TabHost控件完成切换卡功能,完成后的运行效果如图1所示. 图1 主页显示效果 可以看出,在该实例中,总共设置了四个TabHost标签,分别为主页.时间.联系人和搜索.在点击这些标签时,便可以完成相应页面内容的显示. 1.界面布局 TabHost是整个Tab的容器,是由TabWidget和FrameLayout 两部分组成的.其中

【原创】android——Tabhost 自定义tab+底部实现+intent切换内容

1,实现tabhost自定义格式,再此仅仅显示背景和文字,效果图预览:(底边栏所示) (图片变形) 2,xml配置 activity_user的XML配置  1 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/tabhost&qu

Android TabHost(简易用法)

前言 欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 Tab应用的结构 TabHost的Activity的结构如下: <?xml version="1.0" encoding="utf-8"?> <!-- 定义TabHost组件 --> <LinearLayout

Android TabHost 的美化与设计

用到的布局xml文件内容如下: <?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" andro