在Android中,Tab控件是一种很常用的控件;Tab控件即标签页,可以在一页中切换显示N页内容;

  Tab控件具有两种实现过程,一是在同一个Activity中切换显示不同的标签页,这种主要是通过修改布局文件里面的id来实现的,二是每个标签页都由独立的Activity实现;

(1)我们通过继承TabActivity来实现:

但请注意:此类已经过期,官方建议使用Fragment来替代,但仍可以使用;

New applications should use Fragments instead of this class; to continue to run on older devices, you can use the v4 support library which provides a version of the Fragment API that is compatible down to DONUT.

先看实现效果:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/FrameLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

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

    <TextView
        android:id="@+id/TextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/pic1" />

    <TextView
        android:id="@+id/TextView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/pic2" />

    <TextView
        android:id="@+id/TextView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/pic3" />

</FrameLayout>

MainActivity.java

package com.xiaozhang.dialog;

import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;

@SuppressWarnings("deprecation")
public class MainActivity extends TabActivity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TabHost tabHost = getTabHost(); // 获得TabHost对象

        // from(this)从TabActivity获取LayoutInflater
        // 通过TabHost获得存放Tab标签页内容的FrameLayout
        LayoutInflater.from(this).inflate(R.layout.activity_main,
                tabHost.getTabContentView(), true);

        // 设置Tab标签的内容和显示内容
        tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("图片1")
                .setContent(R.id.TextView1));
        tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("图片2")
                .setContent(R.id.TextView2));
        tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("图片3")
                .setContent(R.id.TextView3));
    }

}

另一种实现方式:

当tab页太多的时候,还可以实现TabWidget的左右滚动,通过HorizontalScrollView;

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/hometabs"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- TabHost必须包含一个 TabWidget和一个FrameLayout -->

    <TabHost
        android:id="@+id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <HorizontalScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:scrollbars="none" >

                <!-- TabWidget的id属性必须为 @android:id/tabs -->

                <TabWidget
                    android:id="@android:id/tabs"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal" >
                </TabWidget>
            </HorizontalScrollView>

            <!-- FrameLayout的id属性必须为 @android:id/tabcontent -->

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

                <TextView
                    android:id="@+id/view1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/textview1" />

                <TextView
                    android:id="@+id/view2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/textview2" />

                <TextView
                    android:id="@+id/view3"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/textview3" />

                <TextView
                    android:id="@+id/view4"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/textview4" />

                <TextView
                    android:id="@+id/view5"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/textview5" />

                <TextView
                    android:id="@+id/view6"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/textview6" />
            </FrameLayout>
        </LinearLayout>
    </TabHost>

</LinearLayout>

MainActivity.java

package com.xiaozhang.dialog;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TabHost;

public class MainActivity extends Activity {

    TabHost.TabSpec tabSpec;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取TabHost对象
        TabHost tabHost = (TabHost) findViewById(R.id.tabhost);

        // 如果没有继承TabActivity时,通过该种方法加载启动tabHost
        tabHost.setup();

        // 第一个Tab
        tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("第一个标签")
                .setContent(R.id.view1));

        tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("第二个标签")
                .setContent(R.id.view2));

        tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("第三个标签")
                .setContent(R.id.view3));

        tabHost.addTab(tabHost.newTabSpec("tab4").setIndicator("第四个标签")
                .setContent(R.id.view4));

        tabHost.addTab(tabHost.newTabSpec("tab5").setIndicator("第五个标签")
                .setContent(R.id.view5));

        tabHost.addTab(tabHost.newTabSpec("tab6").setIndicator("第六个标签")
                .setContent(R.id.view6));
    }

}

(2)使用Fragment来使不同的Tab内容在不同的Activity中显示;

MainActivity.java

package com.example.tabhostdemo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;
import android.view.View;
import android.widget.TextView;

import com.example.tabhost.FirstFragment;
import com.example.tabhost.ThirdFragment;
import com.example.tabhost.SecondFragment;

public class MainActivity extends FragmentActivity {

    private FragmentTabHost mTabHost = null;;
    private View indicator = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

        // 添加tab名称和图标
        indicator = getIndicatorView("我的联系人", R.layout.column1);
        mTabHost.addTab(mTabHost.newTabSpec("myContact")
                .setIndicator(indicator), FirstFragment.class, null);

        indicator = getIndicatorView("陌生人", R.layout.column2);
        mTabHost.addTab(
                mTabHost.newTabSpec("stranger").setIndicator(indicator),
                SecondFragment.class, null);

        indicator = getIndicatorView("常联系人", R.layout.column3);
        mTabHost.addTab(
                mTabHost.newTabSpec("alwaysContact").setIndicator(indicator),
                ThirdFragment.class, null);
    }

    private View getIndicatorView(String name, int layoutId) {
        View v = getLayoutInflater().inflate(layoutId, null);
        TextView tv = (TextView) v.findViewById(R.id.tabText);
        tv.setText(name);
        return v;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mTabHost = null;
    }
}

FirstFragment.java

package com.example.tabhost;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout.LayoutParams;
import android.widget.Toast;

public class FirstFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        Button button = new Button(getActivity());
        button.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast toast = Toast.makeText(getActivity(), "点击按钮后",
                        Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER, toast.getXOffset() / 2,
                        toast.getYOffset() / 2);
                toast.show();
            }
        });
        button.setText("第一页");
        return button;
    }

}

SecondFragment.java

package com.example.tabhost;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

import com.example.tabhostdemo.R;

public class SecondFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (container == null)
            return null;

        LinearLayout layout = new LinearLayout(getActivity());
        layout.setOrientation(LinearLayout.VERTICAL);
        TextView text = new TextView(getActivity());
        text.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT));

        ImageView image = new ImageView(getActivity());
        image.setImageResource(R.drawable.pic1);
        image.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT));

        int padding = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 4, getActivity().getResources()
                        .getDisplayMetrics());
        text.setPadding(padding, padding, padding, padding);
        text.setText("我是第二页");
        text.setGravity(Gravity.CENTER);

        layout.addView(text, 0);
        layout.addView(image, 0);
        return layout;
    }
}

ThirdFragment.java

package com.example.tabhost;

import com.example.tabhostdemo.R;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout.LayoutParams;

public class ThirdFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        ImageView image = new ImageView(getActivity());
        image.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        image.setImageResource(R.drawable.pic3);
        return image;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- 这个布局决定了标签在上面还是在下面显示 -->
    <!-- 如果想要标签页在上面,只需要交换FrameLayout和<TabWidget的位置,
        或 直接将FrameLayout放到FragmentTabHost后面  -->

    <FrameLayout
        android:id="@+id/realtabcontent"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" />
    </android.support.v4.app.FragmentTabHost>

</LinearLayout>

column1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center">

    <TextView
        android:id="@+id/tabText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:drawableTop="@drawable/column1_selector"
        android:textColor="@drawable/update_txt"/>
</LinearLayout>

column2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center">

    <TextView
        android:id="@+id/tabText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:drawableTop="@drawable/column2_selector"
        android:textColor="@drawable/update_txt"/>
</LinearLayout>

column3.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center">

    <TextView
        android:id="@+id/tabText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:drawableTop="@drawable/column3_selector"
        android:textColor="@drawable/update_txt"/>
</LinearLayout>

update_txt.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Non focused states -->
    <item android:state_focused="false" android:state_pressed="false" android:state_selected="false" android:color="#A4A4A4"/>
    <item android:state_focused="false" android:state_pressed="false" android:state_selected="true" android:color="#00A3F5"/>
    <!-- Focused states -->
    <item android:state_focused="true" android:state_pressed="false" android:state_selected="false" android:color="#00A3F5"/>
    <item android:state_focused="true" android:state_pressed="false" android:state_selected="true" android:color="#00A3F5"/>
    <!-- Pressed -->
    <item android:state_pressed="true" android:state_selected="true" android:color="#00A3F5"/>
    <item android:state_pressed="true" android:color="#00A3F5"/>

</selector>

另有图片,还有三个xml文件没有贴出;

第二种方式参考自:

http://blog.csdn.net/deng0zhaotai/article/details/11264643

Android Tab控件简介的更多相关文章

  1. 一个Demo让你掌握Android所有控件

    原文:一个Demo让你掌握Android所有控件 本文是转载收藏,侵删,出处:"安卓巴士"      下面给出实现各个组件的源代码: 1.下拉框实现--Spinner packag ...

  2. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  3. Android基础控件ListView基础操作

    1.简介 基于Android基础控件ListView和自定义BaseAdapter适配器情况下,对ListView的数据删除和添加操作: public boolean add(E e) {//添加数据 ...

  4. Appium Android Toast控件

    Android Toast控件是Android系统级别的控件,不是App的控件,getPageSource是⽆法找到的. Toast介绍 1.背景 在安卓设备里面,使用各种手机应用程序的时候,需要先进 ...

  5. 扩展easyUI tab控件,添加加载遮罩效果

    项目里要用HighChart显示图表,如果返回的数量量太多,生成图表是一个很耗时的过程.tab控件又没有显示遮罩的设置(至少本菜是没有找到), Google了一下,根据另一个兄台写的方法,拿来改造了一 ...

  6. NVelocity+Bootstrap tab控件 异常之

    异常信息:Encountered "tings" at line 54, column 55.Was expecting one of:   "(" ...   ...

  7. android 基础控件(EditView、SeekBar等)的属性及使用方法

        android提供了大量的UI控件,本文将介绍TextView.ImageView.Button.EditView.ProgressBar.SeekBar.ScrollView.WebView ...

  8. Android基本控件之Menus

    在我们的手机中有很多样式的菜单,比如:我们的短信界面,每条短信,我们长按都会出现一个菜单,还有很多的种类.那么现在,我们就来详细的讨论一下安卓中的菜单 Android的控件中就有这么一个,叫做Menu ...

  9. Android:控件布局(相对布局)RelativeLayout

    RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列. 相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above-- ...

随机推荐

  1. AOJ 0118 深度优先搜索

    日文题... 题意:一个面积为H*W的果园,种了苹果,梨和蜜柑.相邻(上下左右)的果树属于同一个区域,问果园共有多少个区域. 分析:迷宫问题.对于每一个格子,可以用深度优先搜索把相同果树的格子遍历并标 ...

  2. Java枚举7常见种用法

    DK1.5引入了新的类型——枚举.在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便. 方法/步骤 用法一:常量 在JDK1.5之前,我们定义常量都是:publicstaticfianl. ...

  3. [置顶] 【Git入门之十】Rebase操作

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309627 Rebase,衍合?变基?唉,我也不知道要怎么翻译合适...变 ...

  4. ORCL_INSTALL_WIN10

    0.相关问题 INS-13001环境不满足最低要求: Win10下安装Oracle11g 不满足配置解决方法如下: 原因:Oracle 在发布 11g时,Winodws 10还没有发布.所以Oracl ...

  5. Java随机数生产算法

    java提供了Math.random()函数,返回一个double类型的随机数,也有util包里的Random类,可以生成double,int,float,long,bytes等随机数. 但有些业务需 ...

  6. mac显示隐藏文件夹

    ~/Library/Preferences/com.apple.finder AppleShowAllFiles -bool true (true 改成 false 就可以不再显示隐藏文件)需要重启, ...

  7. Spark的日志配置

    在測试spark计算时.将作业提交到yarn(模式–master yarn-cluster)上,想查看print到控制台这是imposible的.由于作业是提交到yarn的集群上,so 去yarn集群 ...

  8. 2013国内IT行业薪资对照表【技术岗】

    (本文为转载,具体出处不详) 说薪水,是所有人最关心的问题.我只 想说如果想在薪水上面满意,在中国,没有哪里比垄断国企好.电力.烟草.通信才是应该努力的方向.但是像我们这种搞研发的进IT行业似乎是注定 ...

  9. Python之基础(一)

    数学计算 要利用相关的数学计算函数,首先需要把数学模块包含进来: >>>import math 进行计算: >>> math.pi 3.14159265358979 ...

  10. (转)SQL中的ISNULL函数介绍

    SQL中有多种多样的函数,下面将为您介绍SQL中的ISNULL函数,包括其语法.注释.返回类型等,供您参考,希望对您学习SQL能够有所帮助. ISNULL 使用指定的替换值替换 NULL. 语法ISN ...