TabHost的两种使用方法

2024-05-29 10:38
文章标签 使用 方法 两种 tabhost

本文主要是介绍TabHost的两种使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android 实现tab视图有2种方法,一种就是继承tabactivity,一种是在布局页面中定义<tabhost>标签,

第一种:使用系统自带写好的TabHost(及继承自TabActivity类)

其具体步骤如下:
(1)使用setContentView()方法显示界面。
(2)TabHost对象获得并设置。
(3)创建并设置TabSpec对象。
(4)向TabHost中添加TabSpec完成标签页的使用。

<?xml version="1.0" encoding="utf-8"?>  
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent">  <LinearLayout android:id="@+id/tab1"  android:layout_width="fill_parent" android:layout_height="fill_parent"  androidrientation="vertical">  <TextView android:id="@+id/TextView1"  android:text="This is a tab1" android:layout_width="fill_parent"  android:layout_height="wrap_content">  </TextView>  </LinearLayout>  <LinearLayout android:id="@+id/tab2"  android:layout_width="fill_parent" android:layout_height="fill_parent"  androidrientation="vertical">  <TextView android:id="@+id/TextView2"  android:text="This is a tab2" android:layout_width="fill_parent"  android:layout_height="wrap_content">  </TextView>  </LinearLayout>  <LinearLayout android:id="@+id/tab3"  android:layout_width="fill_parent" android:layout_height="fill_parent"  androidrientation="vertical">  <TextView android:id="@+id/TextView3"  android:text="This is a tab3" android:layout_width="fill_parent"  android:layout_height="wrap_content">  </TextView>  </LinearLayout>  
</FrameLayout> 


import android.app.AlertDialog;  
import android.app.Dialog;  
import android.app.TabActivity;  
import android.content.DialogInterface;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.widget.TabHost;  public class Test_TabWidget extends TabActivity {  /** Called when the activity is first created. */  private TabHost tabHost;  @Override  public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  // setContentView(R.layout.main);  tabHost = this.getTabHost();  LayoutInflater li = LayoutInflater.from(this);  li.inflate(R.layout.main, tabHost.getTabContentView(), true);  tabHost.addTab(tabHost.newTabSpec("Tab_1").setContent(R.id.tab1)  .setIndicator("TAB1",  this.getResources().getDrawable(R.drawable.img1)));  tabHost.addTab(tabHost.newTabSpec("Tab_2").setContent(R.id.tab2)  .setIndicator("TAB2",  this.getResources().getDrawable(R.drawable.img2)));  tabHost.addTab(tabHost.newTabSpec("Tab_3").setContent(R.id.tab3)  .setIndicator("TAB3",  this.getResources().getDrawable(R.drawable.img3)));  tabHost.setCurrentTab(1);  
//      tabHost.setBackgroundColor(Color.GRAY);  tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {  public void onTabChanged(String tabId) {  Dialog dialog = new AlertDialog.Builder(Test_TabWidget.this)  .setTitle("提示").setMessage(  "选中了" + tabId + "选项卡").setIcon(R.drawable.icon).setPositiveButton("确定", new DialogInterface.OnClickListener(){  public void onClick(DialogInterface dialog,  int which) {  // TODO Auto-generated method stub  }  }).create();  dialog.show();  }  });  }  
}  

第二种:就是定义我们自己的tabHost:不用继承TabActivity。

在自定义TabHost时需要注意,创建TabHost时需要以下3个步骤:
(1)在xml资源文件中创建TabHost节点,并将id设置为tabhost。
(2)创建TabWidget子节点,并设置id为tabs。
(3)创建FrameLayout子节点,用于显示内容,其id为tabcontent。
与使用TabActivity相比较不难发现,自定义TabHost时不需要继承TabActivity了,只需要简单继承Activity就可以了,这无疑给我们编程提供了更大的自由发挥的空间。因为我们知道继承虽然会给我们的编程带来很大程度的方便,但也同样带来了很多的条条   框框的限制。
让我们着重来看第二步获得TabHost对象,这里的获得TabHost对象的方法与使用TabActivity时又不一样了,具体方法为:
m_TabHost = (TabHost)findViewById(android.R.id.tabhost);
我们发现得到TabHost的方法是最简单、最常见的findViewById()方法!这里的参数就是android.R.id.tabhost,也就是在xml资源文件中我们实现定义的:
android:id="@android:id/tabhost"
需要注意的是,在获得了TabHost之后,我们需要调用:
TabHost.setup()
调用了该方法之后,TabHost才设置完成可以正常使用。而在使用TabActvity时则不需这一步,因为在getTabHost()方法中已经完成了设置的工作。
 
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"  android:id="@+id/TabHost01" android:layout_width="fill_parent"  android:layout_height="fill_parent">  <LinearLayout android:layout_width="fill_parent"  android:orientation="vertical" android:layout_height="fill_parent">    <FrameLayout android:id="@android:id/tabcontent"                                      //这里的id一定要是"@android:id/tabcontent"android:layout_width="fill_parent"  android:layout_height="fill_parent">  <LinearLayout android:id="@+id/LinearLayout1"  android:layout_width="fill_parent"  android:layout_height="wrap_content">  <TextView android:text="one"  android:id="@+id/TextView01" android:layout_width="wrap_content"  android:layout_height="wrap_content">  </TextView>  </LinearLayout>  <LinearLayout android:id="@+id/LinearLayout2"  android:layout_width="wrap_content"  android:layout_height="wrap_content">  <TextView android:text="two"  android:id="@+id/TextView02" android:layout_width="fill_parent"  android:layout_height="wrap_content">  </TextView>  </LinearLayout>  <LinearLayout android:id="@+id/LinearLayout3"  android:layout_width="wrap_content"  android:layout_height="wrap_content">  <TextView android:text="three"  android:id="@+id/TextView03" android:layout_width="fill_parent"  android:layout_height="wrap_content">  </TextView>  </LinearLayout>  </FrameLayout>  <TabWidget android:id="@android:id/tabs"      //注意id表述方式,一定要是"@android:id/tabs"android:layout_width="fill_parent"  android:layout_height="wrap_content" /></LinearLayout> </TabHost>


import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.LayoutInflater;  
import android.widget.TabHost;  public class Test_TabHost extends Activity {  /** Called when the activity is first created. */  private TabHost tabHost;  @Override  public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  try{  tabHost = (TabHost) this.findViewById(R.id.TabHost01);  tabHost.setup();  tabHost.addTab(tabHost.newTabSpec("tab_1")  .setContent(R.id.LinearLayout1)  .setIndicator("TAB1",this.getResources().getDrawable(R.drawable.img1)));  tabHost.addTab(tabHost.newTabSpec("tab_2")  .setContent(R.id.LinearLayout2).setIndicator("TAB2",  this.getResources().getDrawable(R.drawable.img2)));  tabHost.addTab(tabHost.newTabSpec("tab_3")  .setContent(R.id.LinearLayout3).setIndicator("TAB3",  this.getResources().getDrawable(R.drawable.img3)));  tabHost.setCurrentTab(1);  }catch(Exception ex){  ex.printStackTrace();  Log.d("EXCEPTION", ex.getMessage());  }  }  
}  


PS
1、android中的TabActivity是专门用来放置TabHost组件的,但是很遗憾,非常固定,必须放在顶部,对于单手使用手机的人来说,很不方便。所以研究了一下如何将TabBar放置底部,具体思路是在xml布局文件中,将TabWidget放于FrameLayout的下面(两者是垂直线性的关系),并分配各个组件的权重。另外,如果想去掉Tab中那个丑陋的白线,可以通过设置其Padding实现。

2、让自己的类继承TabActivity,然后通过调用getTabHost()方法得到tabhost对象,然后把自己写好的数据展示的布局文件加载到tabhost中,就可以实现了。最后是通过调用addTab()方法添加标签的相关属性(如:标签名称,标签图片,标签内容布局)。
而如果通过XML文件配置tabHost则需要注意的是,framelayout,tabwidget标签的id都必须引用系统的id(@android:id/tabcontent,@android:id/tabs),不然会报异常.在程序用使用findViewById()加载tabhost,然后调用tabhost.setup()方法初始化tabhost,后面的步骤则和上面一种一样

这篇关于TabHost的两种使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1013439

相关文章

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

mybatis-plus QueryWrapper中or,and的使用及说明

《mybatis-plusQueryWrapper中or,and的使用及说明》使用MyBatisPlusQueryWrapper时,因同时添加角色权限固定条件和多字段模糊查询导致数据异常展示,排查发... 目录QueryWrapper中or,and使用列表中还要同时模糊查询多个字段经过排查这就导致只要whe

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数