文档章节

Android选项卡实现之TabHost/TabSpec/TabWidget

古沐风
 古沐风
发布于 2013/11/27 20:36
字数 944
阅读 5929
收藏 10
Tab是什么就不用再用我来描述了。android的ui开发中,承载Tab的容器就是TabHost,每一个Tab对应一个Activity,每个Activity均会有自己的布局。

1.继承TabActivity

2.布局文件中使用tabHost,tabWedgit和framework

3.在activity中通过源码添加tab选项卡,每个选项卡中显示指定activity中的内容。可以通过代码控制界面的显示效果。

下面还是通过一个代码示例来说明下吧:

(1)创建一个新的工程TestTab吧

(2)将生成的MainActivity的继承类改成TabActivity,如果没自动生成mainactivity,那就自己手动创建一个吧:

public class MainActivity extends TabActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

(3)创建main的布局文件

注意:TabHost ,TabWidget ,FrameLayout的ID必须分别为@android :id/tabhost,@android :id/tabs,@android :id/tabcontent
另外还要注意一下android:layout_width宽度和android:layout_height高度的取值,还要LinearLayout的android:orientation=”vertical”(LinearLayout默认是横向的)当你看到布局和我不一样时你就要考虑一下这里是不是错了。(= =!因为我错过)

    这里面的TabHost就是tab区加上对应的属性页;TabWidget就是Tab按钮区,FrameLayout就是属性页区域.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TabHost
        android:id="@android :id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >
            <FrameLayout
                android:id="@android :id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1" />
            <TabWidget
                android:id="@android :id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="0"
                android:orientation="horizontal" />
            <!--  android:background="@drawable/jdy_tab_background"-->
        </LinearLayout>
    </TabHost>
</LinearLayout>

(4)创建tab元素:TabSpec

    这里面会涉及到对象TabSpec。该对象通常用TabHost来创建,里面包含了一个Tab元素所包含的信息需要用户来指定。下面来看看官方文档的解释吧:

A tab has a tab indicator, content, and a tag that is used to keep track of it. This builder helps choose among these options. For the tab indicator, your choices are: 1) set a label 2) set a label and an icon For the tab content, your choices are: 1) the id of a View 2) a TabHost.TabContentFactory that creates the View content. 3) an Intent that launches an Activity.
 

    一个tab通常包含了indicator(指示器)、content(tab对应展示的页面view,可以为这个view的id或者是一个intent)、tag。其中TabSpec就是用来辅助设置这些选项。

    <1> Indicator通常是设置tab的名称label和icon。

    <2> Content:可以是一个view的id,也可以通过TabContentFactory创建一个view,还可以是一个Intent组件来加载一个activity。

(5)创建两个Activity,暂且叫FirstActivity,SecActivity,并在Manifest文件中注册

public class SettingActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        TextView textview = new TextView(this);
        textview.setText("设置页面");
        setContentView(textview);
    }
}  

(6)在MainActivity中添加Tab -- 使用TabSpec

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mTabHost = getTabHost();
        TabSpec spec;
        
        spec = mTabHost.newTabSpec("新建");    
        spec.setIndicator("新建");
        spec.setContent(new Intent(this, NewTaskActivity.class));
        mTabHost.addTab(spec);
        
        spec = mTabHost.newTabSpec("设置");    
        spec.setIndicator("设置");
        spec.setContent(new Intent(this, SettingActivity.class));
        mTabHost.addTab(spec);
          
        mTabHost.setCurrentTab(0);         
    }

至此,一个简单的tab就做完了,运行下就可以看到结果。你也可以根据自己的喜好更改下每个tab的内容的activity样子。

(7)TabWidget说明:

java.lang.Object
   ↳ android.view.View
     ↳ android.view.ViewGroup
       ↳ android.widget.LinearLayout
         ↳ android.widget.TabWidget

    通过上面的类继承关系就可以看出TabWidget是一个ViewGroup,即是一个线性布局的容器,能够容纳多个Tab。同时“The container object for this widget is TabHost”。它也是TabHost内的一个widget。


不过用过API4.0的小伙伴一定都会发现TabActivity已经被android弃用了。

    TabActivity has been deprecated, cause it is subclass of ActivityGroup, which also has been deprecated.

    ActityGroup has been deprecated, and instead Fragment has been introduced and suggested. As using Fragments is easier and more flexible than ActivityGroup. It also enable android components to have a homogeneous pattern.

后面,我们决定采用Fragment实现tab形式的页面,也与时俱进下。 待续... ...








© 著作权归作者所有

共有 人打赏支持
古沐风
粉丝 9
博文 7
码字总数 9598
作品 0
杭州
私信 提问
加载中

评论(2)

古沐风
古沐风

引用来自“光旭”的评论

我们实验室正好遇到了这个问题,现解决了,

哈哈,欢迎分享更多心得,大家彼此进步
光旭
光旭
我们实验室正好遇到了这个问题,现解决了,
Android TabHost 详细讲解

一、什么是TabHost。 Android 里面的TabHost就是选项卡,看下图(新浪微博界面): 至于选项卡有什么好处或者用途,我想代码哥们都知道吧,我就不多说了。 二、在Android里面如何实现TabHost 有...

长平狐
2012/09/03
2.6K
1
android TabHost(选项卡)的使用方法

Android中的选项卡是用TabHost实现的,下面我们用一个例子说明他的使用方法 首先,定义TabHost的布局文件: 代码如下:

liuzs1208
2015/02/25
0
0
Android ——TabHost使用

在Android中,通常可以使用切换卡(选项卡)实现切换显示不同页面内容的功能。这一功能可以通过TabHost控件来实现。   下面我们就通过一个简单的实例演示如何使用TabHost控件完成切换卡功能...

的书法上的
2014/08/05
0
0
android 2.3 r1 中文 api (58) —— TabHost

一、结构 public class TabHost extends FrameLayout implements ViewTreeObserver.OnTouchModeChangeListener java.lang.Object android.view.View android.view.ViewGroup android.widget.......

walb呀
2017/12/05
0
0
android tabhost

结构 继承关系 public class TabHost extends FrameLayout implements ViewTreeObserver.OnTouchModeChangeListener java.lang.Object android.view.View android.view.ViewGroup android.w......

amigos_wu
2012/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习设计模式之路

https://java-design-patterns.com/patterns/ https://www.oodesign.com/ https://www.programering.com/a/MTNxAzMwATY.html https://design-patterns.readthedocs.io/zh_CN/latest/ https:/......

晨猫
7分钟前
0
0
JDK1.8 jar包说明

JDK 1.8 lib:access-bridge-64.jarcharsets.jarcldrdata.jardeploy.jardnsns.jarjaccess.jarjavawa.jarjce.jarjfr.jarjfxrt.jarjfxswt.jarjsse.jarlocaledata.jar......

冷基
10分钟前
0
0
判断用户的icloud是否开启【Swift4.2】

使用icloudkit存储用户私人数据时,必须判断用户的icloud是否开启【Swift4.2】 func isICloudContainerAvailable()-> Bool { if FileManager.default.ubiquityIdentityToken != ni......

叶落花开
30分钟前
1
0
今天的学习

1、执行git add *命令就把改动提交到了暂存区,执行git pull命令将远程仓库的数据拉到当前分支并合并,执行git checkout [branch-name]切换分支 2、执行git commit -m '说明' 命令就把改动提...

墨冥
昨天
0
0
Android4.4 及以下TextView,Button等控件使用矢量图报错

1 问题描述 最近项目开发中,图标资源我尽量使用了矢量图,然而配置了基本的兼容设置,程序在低版本中运行还是出现了问题。 xml布局文件中,在TextView中使用矢量图,比如android:drawableS...

newtrek
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部