史上最全的Android的Tab与TabHost讲解

2024-04-29 00:48

本文主要是介绍史上最全的Android的Tab与TabHost讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tab与TabHost
device.png 
这就是Tab,而盛放Tab的容器就是TabHost
如何实现??
每一个Tab还对应了一个布局,这个就有点好玩了。一个Activity,对应了多个功能布局。
①新建一个Tab项目,注意,不要生成main Activity
55.png 
这里不要选
②在包里面新建一个类MyTab,继承于TabActivity
其实,TabActivity是Activity的子类
  1. package zyf.tab.test;

  2. import android.app.TabActivity;

  3. public class MyTab extends TabActivity {

  4. }
③从父类继承OnCreate()入口方法
  1. package zyf.tab.test;
  2. import android.app.TabActivity;
  3. import android.os.Bundle;
  4. public class MyTab extends TabActivity {
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         // TODO Auto-generated method stub
  8.         super.onCreate(savedInstanceState);
  9.     }
  10. }
④在Manifest.xml文件中注册一下MyTab类(Activity)
  1. <activity android:name=".MyTab">
  2.     <intent-filter>
  3.         <action android:name="android.intent.action.MAIN"></action>
  4.         <category android:name="android.intent.category.LAUNCHER"></category>
  5.     </intent-filter>
  6. </activity>
⑤这时候,需要设计一下标签页对应的布局,一般采用FrameLayout作为根布局,每个标签页面对应一个子节点的Layout
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--  这里是根节点布局  -- >
  3. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4.     android:layout_width="fill_parent" android:layout_height="fill_parent">

  5. <!--  第一个Tab 对应的布局  -- >
  6.     <LinearLayout android:id="@+id/widget_layout_Blue"
  7.         android:layout_width="fill_parent" android:layout_height="fill_parent"
  8.         androidrientation="vertical" >
  9.         <EditText android:id="@+id/widget34" android:layout_width="fill_parent"
  10.             android:layout_height="wrap_content" android:text="EditText"
  11.             android:textSize="18sp">
  12.         </EditText>
  13.         <Button android:id="@+id/widget30" android:layout_width="wrap_content"
  14.             android:layout_height="wrap_content" android:text="Button">
  15.         </Button>
  16.     </LinearLayout>
  17. <!--  第二个Tab 对应的布局  -- >
  18.     <LinearLayout android:id="@+id/widget_layout_red"
  19.         android:layout_width="fill_parent" android:layout_height="fill_parent"
  20.         androidrientation="vertical"  >
  21.         <AnalogClock android:id="@+id/widget36"
  22.             android:layout_width="wrap_content" android:layout_height="wrap_content">
  23.         </AnalogClock>
  24.     </LinearLayout>
  25. <!--  第三个Tab 对应的布局  -- >
  26.     <LinearLayout android:id="@+id/widget_layout_green"
  27.         android:layout_width="fill_parent" android:layout_height="fill_parent"
  28.         androidrientation="vertical">
  29.         <RadioGroup android:id="@+id/widget43"
  30.             android:layout_width="166px" android:layout_height="98px"
  31.             androidrientation="vertical">
  32.             <RadioButton android:id="@+id/widget44"
  33.                 android:layout_width="wrap_content" android:layout_height="wrap_content"
  34.                 android:text="RadioButton">
  35.             </RadioButton>
  36.             <RadioButton android:id="@+id/widget45"
  37.                 android:layout_width="wrap_content" android:layout_height="wrap_content"
  38.                 android:text="RadioButton">
  39.             </RadioButton>
  40.         </RadioGroup>
  41.     </LinearLayout>
  42. </FrameLayout>
⑥首先,应该声明TabHost,然后用LayoutInflater过滤出布局来,给TabHost加上含有Tab页面的FrameLayout
  1. private TabHost myTabhost;
  2. myTabhost=this.getTabHost();//从TabActivity上面获取放置Tab的TabHost
  3. LayoutInflater.from(this).inflate(R.layout.main, myTabhost.getTabContentView(), true);
  4. //from(this)从这个TabActivity获取LayoutInflater
  5. //R.layout.main 存放Tab布局
  6. //通过TabHost获得存放Tab标签页内容的FrameLayout
  7. //是否将inflate 拴系到根布局元素上
  8. myTabhost.setBackgroundColor(Color.argb(150, 22, 70, 150));
  9. //设置一下TabHost的颜色
⑦接着,在TabHost创建一个标签,然后设置一下标题/图标/标签页布局
  1. myTabhost.addTab(myTabhost.newTabSpec("One")// 制造一个新的标签TT
  2.                         .setIndicator("A",
  3.                                 getResources().getDrawable(R.drawable.ajjc))
  4.                         // 设置一下显示的标题为KK,设置一下标签图标为ajjc
  5.                         .setContent(R.id.widget_layout_red));
  6.         //设置一下该标签页的布局内容为R.id.widget_layout_red,这是FrameLayout中的一个子Layout
⑧标签切换事件处理,setOnTabChangedListener
  1. myTabhost.setOnTabChangedListener(new OnTabChangeListener(){
  2.             @Override
  3.             public void onTabChanged(String tabId) {
  4.                 // TODO Auto-generated method stub
  5.             }            
  6.         });
⑨各个标签页的动态MENU
先把在XML中设计好的MENU放到一个int数组里
  1. private static final int myMenuResources[] = { R.menu.phonebook_menu,
  2.             R.menu.addphone_menu, R.menu.chatting_menu, R.menu.userapp_menu };
在setOnTabChangedListener()方法中根据标签的切换情况来设置myMenuSettingTag
  1. @Override
  2.     public void onTabChanged(String tagString) {
  3.         // TODO Auto-generated method stub
  4.         if (tagString.equals("One")) {
  5.             myMenuSettingTag = 1;
  6.         }
  7.         if (tagString.equals("Two")) {
  8.             myMenuSettingTag = 2;
  9.         }
  10.         if (tagString.equals("Three")) {
  11.             myMenuSettingTag = 3;
  12.         }
  13.         if (tagString.equals("Four")) {
  14.             myMenuSettingTag = 4;
  15.         }
  16.         if (myMenu != null) {
  17.             onCreateOptionsMenu(myMenu);
  18.         }
  19.     }
然后onCreateOptionsMenu(Menu menu) 方法中通过MenuInflater过滤器动态加入MENU
  1.  @Override
  2.     public boolean onCreateOptionsMenu(Menu menu) {
  3.         // TODO Auto-generated method stub
  4.         // Hold on to this
  5.         myMenu = menu;
  6.         myMenu.clear();//清空MENU菜单
  7.         // Inflate the currently selected menu XML resource.
  8.         MenuInflater inflater = getMenuInflater();        
  9. //从TabActivity这里获取一个MENU过滤器
  10.         switch (myMenuSettingTag) {
  11.         case 1:
  12.             inflater.inflate(myMenuResources[0], menu);
  13.             //动态加入数组中对应的XML MENU菜单
  14.             break;
  15.         case 2:
  16.             inflater.inflate(myMenuResources[1], menu);
  17.             break;
  18.         case 3:
  19.             inflater.inflate(myMenuResources[2], menu);
  20.             break;
  21.         case 4:
  22.             inflater.inflate(myMenuResources[3], menu);
  23.             break;
  24.         default:
  25.             break;
  26.         }
  27.         return super.onCreateOptionsMenu(menu);
  28.     }
⑩运行效果
device-1.png 


device-2.png 


device-3.png 


源码包:  Tab.rar (49.18 KB, 下载次数: 16453) 


本教程电子书:  Tab与TabHost.pdf (526.08 KB, 下载次数: 12155) 


更多内容推荐:
一、自定义tabhost实例(内含源码)
QQ截图20120611113819.png 
源码链接:
http://www.eoeandroid.com/thread-109336-1-1.html

二、Android--选项卡结合案例详解(内含源码)
链接地址:
http://www.eoeandroid.com/thread-159185-1-1.html

三、tabHost标签的使用方法(内含源码)
QQ截图20120611113630.png 

链接地址:http://www.eoeandroid.com/thread-56279-1-1.html

原文地址:点击打开链接

这篇关于史上最全的Android的Tab与TabHost讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944697

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

MySQL连表查询之笛卡尔积查询的详细过程讲解

《MySQL连表查询之笛卡尔积查询的详细过程讲解》在使用MySQL或任何关系型数据库进行多表查询时,如果连接条件设置不当,就可能发生所谓的笛卡尔积现象,:本文主要介绍MySQL连表查询之笛卡尔积查... 目录一、笛卡尔积的数学本质二、mysql中的实现机制1. 显式语法2. 隐式语法3. 执行原理(以Nes

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期