当前位置:首页 > 技术 > 正文内容

Android中TabHost实现多标签页面切换

访客 技术 2026年6月24日 1

TabHost实现标签页切换功能

在Android应用开发中,由于移动设备屏幕尺寸的限制,我们经常需要在有限的屏幕空间内展示多个功能模块。TabHost组件提供了一种便捷的方式来实现标签页切换效果,可以在同一个Activity中展示多个子页面,用户通过点击不同的标签即可切换显示内容。

下面是实现后的效果预览:

接下来介绍两种常用的实现方式:

方式一:本地视图切换模式

首先创建布局文件,定义TabHost和各个标签页的内容:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TabHost 
        android:id="@+id/musicTabHost"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        <LinearLayout 
            android:id="@+id/localMusicContainer"
            android:orientation="vertical"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            >
            <TextView
                android:text="流行音乐"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView
                android:text="经典老歌"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView
                android:text="轻音乐"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </LinearLayout>
        
        <LinearLayout 
            android:id="@+id/onlineMusicContainer"
            android:orientation="vertical"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            >
            <TextView
                android:text="网络热歌"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView
                android:text="新歌推荐"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView
                android:text="排行榜"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </LinearLayout>
        
        <LinearLayout 
            android:id="@+id/favoriteMusicContainer"
            android:orientation="vertical"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            >
            <TextView
                android:text="我喜欢的音乐"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView
                android:text="收藏列表"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView
                android:text="最近播放"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </LinearLayout>
    </TabHost>

</RelativeLayout>

对应的Activity代码实现:

public class MusicPlayerActivity extends TabActivity{
    private TabHost musicTabHost = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        musicTabHost = getTabHost();
        LayoutInflater.from(this).inflate(R.layout.music_layout, musicTabHost.getTabContentView(), true);
        
        musicTabHost.addTab(musicTabHost.newTabSpec("local").setIndicator("本地音乐").setContent(R.id.localMusicContainer));
        musicTabHost.addTab(musicTabHost.newTabSpec("online").setIndicator("在线音乐").setContent(R.id.onlineMusicContainer));
        musicTabHost.addTab(musicTabHost.newTabSpec("favorite").setIndicator("我的收藏").setContent(R.id.favoriteMusicContainer));     
    }
}

以上代码实现了最基本的本地内容切换功能。

方式二:Intent跳转模式

这种方式允许点击标签时跳转到其他Activity,首先创建布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >
    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout 
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >
            <FrameLayout 
                android:id="@+id/contentFrame"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="5dp"
                />
            <TabWidget
                android:layout_alignParentBottom="true"  
                android:id="@+id/tabWidget"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </LinearLayout>
    </TabHost>
</RelativeLayout>

Activity中的实现逻辑:

public class MainTabActivity extends TabActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Resources resources = getResources();
        TabHost tabHost = getTabHost(); 
        TabHost.TabSpec tabSpec; 
        Intent intent;
        
        LayoutInflater.from(this).inflate(R.layout.main_tab_layout, tabHost.getTabContentView(), true);
        
        intent = new Intent().setClass(MainTabActivity.this, DialerActivity.class);
        tabHost.addTab(tabHost.newTabSpec("dialer").setIndicator("拨号", resources.getDrawable(R.drawable.ic_tab_dialer))
        .setContent(intent));
        
        intent = new Intent().setClass(MainTabActivity.this, ContactsActivity.class);
        
        tabSpec = tabHost.newTabSpec("contacts").setIndicator("联系人", resources.getDrawable(R.drawable.ic_tab_contacts))
                .setContent(intent);
        tabHost.addTab(tabSpec);
        
        intent = new Intent().setClass(MainTabActivity.this, CallLogActivity.class);
        
        tabSpec = tabHost.newTabSpec("calllog").setIndicator("通话记录", resources.getDrawable(R.drawable.ic_tab_calllog))
                .setContent(intent);
        tabHost.addTab(tabSpec);
        
        tabHost.setCurrentTab(1);
        
    }
}

在使用图片资源作为标签图标时,需要创建相应的选择器配置文件来实现选中/未选中状态的切换效果:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_tab_contacts_grey"
          android:state_selected="true" />
    <item android:drawable="@drawable/ic_tab_contacts_white"
        android:state_selected="false" />
</selector>

上述两种实现方式可以根据实际需求选择:第一种适合内容较少且不需要跳转到其他页面的场景;第二种则适用于需要显示独立Activity的复杂场景。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。