Android选项卡TabHost功能和用法

article/2025/9/9 15:22:44

1、选项卡TabHost介绍
TabHost可以方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器大小相同的组件摆放区域
TabHost是一个简单的容器,提供如下两种方法来创建选项卡
newTabSpec(String tag):创建选项卡
addTab(TabHost.TabSpec tabSpec):添加选项卡
使用TabHost有三种方法

2、方法1,继承TabActivity
主布局文件不需要定义TabHost组件,这里用三个垂直的LinearLayout作为标签页,每个标签页里面有两个TextView组件,main_tab.xml代码如下:

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@android:id/tabcontent"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 定义第一个标签页的内容 --><LinearLayoutandroid:id="@+id/tab01"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第一个标签页的第1个TextView组件"android:textSize="8pt" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第一个标签页的第2个TextView组件"android:textSize="8pt" /></LinearLayout><!-- 定义第二个标签页的内容 --><LinearLayoutandroid:id="@+id/tab02"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第二个标签页的第1个TextView组件"android:textSize="8pt" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第二个标签页的第2个TextView组件"android:textSize="8pt" /></LinearLayout><!-- 定义第三个标签页的内容 --><LinearLayoutandroid:id="@+id/tab03"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第三个标签页的第1个TextView组件"android:textSize="8pt" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第三个标签页的第2个TextView组件"android:textSize="8pt" /></LinearLayout>
</FrameLayout>

在Java代码中将Activity继承TabActivity,具体代码如下:


package com.example.tabhosttest;import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.Toast;public class MainActivity extends TabActivity
{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);//setContentView(R.layout.main_tab);// 获取该Activity里面的TabHost组件TabHost tabHost = getTabHost();LayoutInflater.from(this).inflate(R.layout.main_tab,  tabHost.getTabContentView(), true);// 创建第一个Tab页/*TabHost.TabSpec tab1 = tabHost.newTabSpec("tab1").setIndicator("标签页一") // 设置标题.setContent(R.id.tab01); //设置内容// 添加第一个标签页tabHost.addTab(tab1);TabHost.TabSpec tab2 = tabHost.newTabSpec("tab2").setIndicator("标签页二").setContent(R.id.tab02);// 添加第二个标签页tabHost.addTab(tab2);TabHost.TabSpec tab3 = tabHost.newTabSpec("tab3").setIndicator("标签页三").setContent(R.id.tab03);// 添加第三个标签页tabHost.addTab(tab3);*//* 以上创建和添加标签页也可以用如下代码实现 */tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("标签页一").setContent(R.id.tab01));tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("标签页二").setContent(R.id.tab02));tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("标签页三").setContent(R.id.tab03));//标签切换事件处理,setOnTabChangedListener  tabHost.setOnTabChangedListener(new OnTabChangeListener(){    @Override  // tabId是newTabSpec参数设置的tab页名,并不是layout里面的标识符idpublic void onTabChanged(String tabId) {  if (tabId.equals("tab1")) {   //第一个标签  Toast.makeText(MainActivity.this, "点击标签页一", Toast.LENGTH_SHORT).show();}  if (tabId.equals("tab2")) {   //第二个标签  Toast.makeText(MainActivity.this, "点击标签页二", Toast.LENGTH_SHORT).show();}  if (tabId.equals("tab3")) {   //第三个标签  Toast.makeText(MainActivity.this, "点击标签页三", Toast.LENGTH_SHORT).show();}  }              }); }
}

这里有两个地方注意一下,第一没有使用setContentView,而是用inflate方法;第二在设置标签页改变监听器时,onTabChanged的参数tabId是使用newTabSpec方法的参数设置的标签页名称,而不是布局文件中标签页的标识符Id;第三为了测试方便使用了Toast,
关于inflate和Toast,下面再学习,先简单了解一下
LayoutInflater的作用是将xml布局文件实例话,Toast是在屏幕上显示提示信息
点击第二个标签页之后,显示效果如下图9-2-1所示:

图 9-2-1

 

3、方法2,在布局文件中使用TabHost,不用继承TabActivity
使用findViewById获取TabHost组件
1 在界面布局中定义TabHost组件,并为该组件定义选项卡内容
2 使用findViewById获取TabHost组件
3 通过TabHost对象的方法来创建和添加选项卡
布局文件为activity_main.xml如下:

<TabHostxmlns:android="http://schemas.android.com/apk/res/android"android:id="@android:id/tabhost"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"><LinearLayout android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><!-- TabWidget组件id值不可变--><TabWidget android:id="@android:id/tabs"android:layout_width="match_parent"android:layout_height="wrap_content"></TabWidget><!-- FrameLayout布局,id值不可变--><FrameLayout android:id="@android:id/tabcontent"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_above="@android:id/tabs"><!-- 第一个tab的布局 -->  <LinearLayout  android:id="@+id/tab1"  android:layout_width="match_parent"  android:layout_height="match_parent" >  <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="第一个tab的布局" />  </LinearLayout>  <!-- 第二个tab的布局 -->  <LinearLayout  android:id="@+id/tab2"  android:layout_width="match_parent"  android:layout_height="match_parent" >  <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="第二个tab的布局" />  </LinearLayout>  </FrameLayout>     </LinearLayout>   
</TabHost>

 

java代码如下:

package com.example.tabhost;


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


public class MainActivity extends Activity {


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


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

        //初始化TabHost容器
        tab.setup();             
        //在TabHost创建标签,然后设置:标题/图标/标签页布局  
        tab.addTab(tab.newTabSpec("tab1").setIndicator("本地音乐" , null).setContent(R.id.tab1));  
        tab.addTab(tab.newTabSpec("tab2").setIndicator("网络音乐" , null).setContent(R.id.tab2));    
      
    }
    
}

这段非转载代码,用的和作者不是一个xml,效果图如下:

4、方法3基本和方法2类似,不用继承TabActivity,只是Tab的内容分开到单独的xml文件,每个标签页都需要inflate一次,和方法2最大的区别就是标签页分开到不同的xml文件中
tab1对应的tab1.xml:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tab01"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第一个标签页的第1个TextView组件"android:textSize="8pt" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第一个标签页的第2个TextView组件"android:textSize="8pt" />
</LinearLayout>

tab2对应的tab2.xml:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tab02"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第二个标签页的第1个TextView组件"android:textSize="8pt" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第二个标签页的第2个TextView组件"android:textSize="8pt" />
</LinearLayout>

tab3对应的tab3.xml:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tab03"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第三个标签页的第1个TextView组件"android:textSize="8pt" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第三个标签页的第2个TextView组件"android:textSize="8pt" />
</LinearLayout>

主布局文件main.xml:

<?xml version="1.0" encoding="utf-8"?>
<TabHostxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tabhost"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TabWidgetandroid:id="@android:id/tabs"android:layout_width="match_parent"android:layout_height="wrap_content"/><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="match_parent"android:layout_height="match_parent"></FrameLayout></LinearLayout>
</TabHost>

Java代码如下:


package com.example.tabhosttest;import android.app.Activity;
import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.Toast;public class MainActivity extends Activity
{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 方法2、3使用:setContentView(R.layout.main);// 获取该Activity里面的TabHost组件// 方法1使用:// TabHost tabHost = getTabHost();// 方法1使用:// LayoutInflater.from(this).inflate(R.layout.main_tab, tabHost.getTabContentView(), true);// 方法2、3使用TabHost tabHost = (TabHost)findViewById(R.id.tabhost);tabHost.setup();// 方法3使用,动态载入xml,不需要ActivityLayoutInflater.from(this).inflate(R.layout.tab1, tabHost.getTabContentView());LayoutInflater.from(this).inflate(R.layout.tab2, tabHost.getTabContentView());LayoutInflater.from(this).inflate(R.layout.tab3, tabHost.getTabContentView());// 创建第一个Tab页/*TabHost.TabSpec tab1 = tabHost.newTabSpec("tab1").setIndicator("标签页一") // 设置标题.setContent(R.id.tab01); //设置内容// 添加第一个标签页tabHost.addTab(tab1);TabHost.TabSpec tab2 = tabHost.newTabSpec("tab2").setIndicator("标签页二").setContent(R.id.tab02);// 添加第二个标签页tabHost.addTab(tab2);TabHost.TabSpec tab3 = tabHost.newTabSpec("tab3").setIndicator("标签页三").setContent(R.id.tab03);// 添加第三个标签页tabHost.addTab(tab3);*//* 以上创建和添加标签页也可以用如下代码实现 */tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("标签页一").setContent(R.id.tab01));tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("标签页二").setContent(R.id.tab02));tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("标签页三").setContent(R.id.tab03));//标签切换事件处理,setOnTabChangedListener  tabHost.setOnTabChangedListener(new OnTabChangeListener(){    @Override  // tabId是newTabSpec第一个参数设置的tab页名,并不是layout里面的标识符idpublic void onTabChanged(String tabId) {  if (tabId.equals("tab1")) {   //第一个标签  Toast.makeText(MainActivity.this, "点击标签页一", Toast.LENGTH_SHORT).show();}  if (tabId.equals("tab2")) {   //第二个标签  Toast.makeText(MainActivity.this, "点击标签页二", Toast.LENGTH_SHORT).show();}  if (tabId.equals("tab3")) {   //第三个标签  Toast.makeText(MainActivity.this, "点击标签页三", Toast.LENGTH_SHORT).show();}  }              }); }
}

 


 

 


http://chatgpt.dhexx.cn/article/XwlSRDCe.shtml

相关文章

[Android] 选项卡组件TabHost

Tab选项卡实现多个分页之间的快速切换&#xff0c;每个分页可以显示不同的内容&#xff0c;在Android平台提供了TabHost组件实现Tab选项卡的功能&#xff0c;选项卡组件的主要功能是可以进行应用程序分类管理。 每个选项卡称为一个Tab&#xff0c;而包含这多个选项卡的容器称为…

交叉熵:计算交叉熵损失函数nn.CrossEntropyLoss()

首先要提出的问题是。。。什么是损失函数&#xff1f;干什么的&#xff08;功能&#xff09;&#xff1f;类型有哪些&#xff1f; 1.什么是损失函数&#xff1f; 损失函数&#xff08;loss function&#xff09;或 代价函数&#xff08;cost function&#xff09;是将随机事件或…

softmax函数与交叉熵损失函数

本文主要介绍了当前机器学习模型中广泛应用的交叉熵损失函数与softmax激励函数。 这个损失函数主要应用于多分类问题&#xff0c;用于衡量预测值与实际值之间的相似程度。 交叉熵损失函数定义如下: L C E ( y ^ , y ∗ ) − ∑ i 1 N c l a s s e s y i ∗ l o g ( y i ^ …

【交叉熵损失函数】关于交叉熵损失函数的一些理解

目录 0. 前言1.损失函数&#xff08;Loss Function&#xff09;1.1 损失项1.2 正则化项 2. 交叉熵损失函数2.1 softmax2.2 交叉熵 0. 前言 有段时间没写博客了&#xff0c;前段时间主要是在精读一些计算机视觉的论文&#xff08;比如yolov1&#xff09;&#xff0c;以及学cs23…

CrossEntropy交叉熵损失函数及softmax函数的理解

参考链接1 参考链接2 参考链接3 参考链接4 &#xff08;一&#xff09;什么是Sigmoid函数和softmax函数&#xff1f; 提到二分类问题容易想到逻辑回归算法&#xff0c;而逻辑回归算法最关键的步骤就是将线性模型输出的实数域映射到[0, 1]表示概率分布的有效实数空间&#xff…

【基础篇】交叉熵损失函数(Cross Entropy Loss)

文章目录 1. 理论知识2. 代码 1. 理论知识 我们需要关注那些按常理来说不太可能发生的事情。『信息量』就是用来度量事件的不确定性&#xff0c; 事件包含的信息量应与其发生的概率负相关 。假设 X X X是一个离散型随机变量&#xff0c;它的取值集合为 { x 1 , x 2 , . . . ,…

损失函数-交叉熵的推导和二分类交叉熵

交叉熵 期望&#xff1a; 期望就是所有随机变量的均值。 E(X)X1*P&#xff08;X1&#xff09;X2*P&#xff08;X2&#xff09;X3*P&#xff08;X3&#xff09; 熵&#xff1a; 熵表示所有信息量的期望。 信息量如何计算呢&#xff1f; 概率值取Log&#xff0c;然后加个负…

深度学习中的损失函数(交叉熵)

0、前景介绍 对于线性回归模型适用于输出为连续值的情景&#xff0c;但是在模型输出是一个像图像类别这样的离散值时。对于这样离散值的预测问题&#xff0c;通常使用一些例如sigmoid/softmax的分类模型。 1. 图像分类任务 假设下面两个模型都是通过softmax的方式得到对于每…

图示Softmax及交叉熵损失函数

Softmax函数 Softmax是将神经网络得到的多个值&#xff0c;进行归一化处理&#xff0c;使得到的值在之间&#xff0c;让结果变得可解释。即可以将结果看作是概率&#xff0c;某个类别概率越大&#xff0c;将样本归为该类别的可能性也就越高。Softmax就如下图&#xff08;借鉴李…

最全的交叉熵损失函数(Pytorch)

损失函数 引言BCELossBCEWithLogitsLossNLLLossCrossEntropyLoss总结参考 引言 这里主要讲述pytorch中的几种交叉熵损失类&#xff0c;熵是用来描述一个系统的混乱程度,通过交叉熵我们就能够确定预测数据与真是数据之间的相近程度。交叉熵越小&#xff0c;表示数据越接近真实样…

简单的交叉熵损失函数,你真的懂了吗?

个人网站&#xff1a;红色石头的机器学习之路 CSDN博客&#xff1a;红色石头的专栏 知乎&#xff1a;红色石头 微博&#xff1a;RedstoneWill的微博 GitHub&#xff1a;RedstoneWill的GitHub 微信公众号&#xff1a;AI有道&#xff08;ID&#xff1a;redstonewill&#xf…

交叉熵损失概念

交叉熵是信息论中的一个概念&#xff0c;要想了解交叉熵的本质&#xff0c;需要先从最基本的概念讲起。 1. 信息量 首先是信息量。假设我们听到了两件事&#xff0c;分别如下&#xff1a; 事件A&#xff1a;巴西队进入了2018世界杯决赛圈。 事件B&#xff1a;中国队进入了2…

softmax交叉熵损失函数深入理解(二)

0、前言 前期博文提到经过两步smooth化之后&#xff0c;我们将一个难以收敛的函数逐步改造成了softmax交叉熵损失函数&#xff0c;解决了原始的目标函数难以优化的问题。Softmax 交叉熵损失函数是目前最常用的分类损失函数&#xff0c;本博文继续学习Softmax 交叉熵损失函数的改…

史上最全交叉熵损失函数详解

在我们自学神经网络神经网络的损失函数的时候会发现有一个思路就是交叉熵损失函数&#xff0c;交叉熵的概念源于信息论&#xff0c;一般用来求目标与预测值之间的差距。比如说我们在人脑中有一个模型&#xff0c;在神经网络中还有一个模型&#xff0c;我们需要找到神经网络模型…

交叉熵损失函数原理详解

交叉熵损失函数原理详解 之前在代码中经常看见交叉熵损失函数(CrossEntropy Loss)&#xff0c;只知道它是分类问题中经常使用的一种损失函数&#xff0c;对于其内部的原理总是模模糊糊&#xff0c;而且一般使用交叉熵作为损失函数时&#xff0c;在模型的输出层总会接一个softm…

损失函数——交叉熵损失函数

一篇弄懂交叉熵损失函数 一、定义二、交叉熵损失函数&#xff1a;知识准备&#xff1a;1、信息熵&#xff1a;将熵引入到信息论中&#xff0c;命名为“信息熵”2、 KL散度&#xff08;相对熵&#xff09;&#xff1a; 交叉熵&#xff1a;结论&#xff1a; Softmax公式Sigmoid常…

交叉熵损失函数详解

我们知道&#xff0c;在二分类问题模型&#xff1a;例如逻辑回归「Logistic Regression」、神经网络「Neural Network」等&#xff0c;真实样本的标签为 [0&#xff0c;1]&#xff0c;分别表示负类和正类。模型的最后通常会经过一个 Sigmoid 函数&#xff0c;输出一个概率值&am…

交叉熵损失函数(CrossEntropy Loss)(原理详解)

监督学习主要分为两类&#xff1a; 分类&#xff1a;目标变量是离散的&#xff0c;如判断一个西瓜是好瓜还是坏瓜&#xff0c;那么目标变量只能是1&#xff08;好瓜&#xff09;,0&#xff08;坏瓜&#xff09;回归&#xff1a;目标变量是连续的&#xff0c;如预测西瓜的含糖率…

nn.CrossEntropyLoss()交叉熵损失函数

1、nn.CrossEntropyLoss() 在pytorch中nn.CrossEntropyLoss()为交叉熵损失函数&#xff0c;用于解决多分类问题&#xff0c;也可用于解决二分类问题。在使用nn.CrossEntropyLoss()其内部会自动加上Sofrmax层 nn.CrossEntropyLoss()的计算公式如下&#xff1a; 其中&#xff0c…

损失函数——交叉熵损失函数(CrossEntropy Loss)

损失函数——交叉熵损失函数&#xff08;CrossEntropy Loss&#xff09; 交叉熵函数为在处理分类问题中常用的一种损失函数&#xff0c;其具体公式为&#xff1a; 1.交叉熵损失函数由来 交叉熵是信息论中的一个重要概念&#xff0c;主要用于度量两个概率分布间的差异性。首先…