TabActivity、TabHost、NavController

发布时间:2026/9/2 19:26:06

TabActivity、TabHost、NavController
1.TabActivity 继承自Activity其内部定义好了TabHost可以通过getTabHost()获取TabHost。TabHost 包含了两种子元素一些可以自由选择的Tab及 与这些tab对应的内容tabContent在layout的TabHost下它们分别对应 TabWidget (用于展示标签页 id固定为tabs )和 FrameLayout(用于展示隶属于各个标签的具体布局 id固定为tabcontent)。Tabhost默认的布局文件TabHost xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:idandroid:id/tabhostandroid:layout_widthfill_parentandroid:layout_heightfill_parent LinearLayoutandroid:orientationverticalandroid:gravitybottomandroid:layout_widthfill_parentandroid:layout_heightfill_parent TabWidgetandroid:idandroid:id/tabsandroid:layout_widthfill_parentandroid:layout_heightwrap_content /FrameLayoutandroid:idandroid:id/tabcontentandroid:layout_widthfill_parentandroid:layout_height200dip /FrameLayout/LinearLayout/TabHost2.最简单的TabActivity示例不用设置setContentView(R.layout.main); 不依靠布局文件public class ILoveConactActivity extends TabActivity implements TabHost.TabContentFactory,OnTabChangeListener{public void onCreate(Bundle icicle){super.onCreate(icicle);//取得TabHost对象TabHost tabHostthis.getTabHost();tabHost.setOnTabChangedListener(this);for(int i0;i4;i){String tabItemTitletabi;String tabItemTagi;TabSpec tabSpectabHost.newTabSpec(tabItemTag);tabSpec.setIndicator(tabItemTitle);//或者setIndicator(CharSequence label, Drawable icon) setIndicator(View view)/*或者tabSpec.setContent(R.id.viewId);//R.id.viewId是在布局文件中的view的id。setIndicator(View view)setContent(TabContentFactory contentFactory)时会动态确定内容。setContent(Intent intent) Specify an intent to use to launch an activity as the tab content.*/tabSpec.setContent(this);tabHost.addTab(tabSpec);}tabHost.setCurrentTab(1);//或者setCurrentTabByTag(String tag)//加上下面这4行代码使TabWidget到底部TabWidget tabWidget this.getTabWidget(); //或者tabHost.getTabWidget();LinearLayout layout (LinearLayout) tabHost.getChildAt(0);layout.removeViewAt(0);layout.addView(tabWidget);//把tabWidget 从第一个位置移除再添加到下面来。}Overridepublic void onTabChanged(String tabId){// TODO Auto-generated method stub}Overridepublic View createTabContent(String tag){TextView viewnew TextView(this);view.setText(tab content tag);return view;//不能返回null否则会报错。}}intent必须是一个关联Activity的intent。android中文api (59) —— TabHost.TabSpec - 农民伯伯 - 博客园3.对TabWidget的理解(1)TabWidget 为 horizontal 的 LinearLayout(2)且 其包含的标签又是一个RelativeLayout(3) 每个标签RelativeLayout 里面包含2个ViewTextView和ImageView推算出其布局为?xml version1.0 encodingutf-8?LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationhorizontalandroid:layout_widthfill_parentandroid:layout_heightfill_parentRelativeLayoutandroid:orientationverticalandroid:layout_widthfill_parentandroid:layout_heightwrap_contentImageView /TextView //RelativeLayoutRelativeLayoutandroid:orientationverticalandroid:layout_widthfill_parentandroid:layout_heightwrap_contentImageView /TextView //RelativeLayoutRelativeLayoutandroid:orientationverticalandroid:layout_widthfill_parentandroid:layout_heightwrap_contentImageView /TextView //RelativeLayoutRelativeLayoutandroid:orientationverticalandroid:layout_widthfill_parentandroid:layout_heightwrap_contentImageView /TextView //RelativeLayout/LinearLayout4.基于默认的Tabhost布局文件自定义布局文件?xml version1.0 encodingutf-8?LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationverticalandroid:layout_widthfill_parentandroid:layout_heightfill_parent!-- TabHost必须包含一个 TabWidget和一个FrameLayout--TabHost android:idid/tabhostandroid:layout_widthfill_parentandroid:layout_heightwrap_contentLinearLayoutandroid:orientationverticalandroid:layout_widthfill_parentandroid:layout_heightfill_parent!-- TabWidget的id属性必须为 android:id/tabs--TabWidget android:idandroid:id/tabsandroid:orientationhorizontalandroid:layout_widthfill_parentandroid:layout_heightwrap_content/TabWidget!-- FrameLayout的id属性必须为 android:id/tabcontent--FrameLayout android:idandroid:id/tabcontentandroid:layout_widthfill_parentandroid:layout_heightfill_parentTextView android:idid/view1android:layout_widthfill_parentandroid:layout_heightfill_parent/TextView android:idid/view2android:layout_widthfill_parentandroid:layout_heightfill_parent/TextView android:idid/view3android:layout_widthfill_parentandroid:layout_heightfill_parent//FrameLayout/LinearLayout/TabHost/LinearLayout5.TabHost中的子Activity虽然是用Intent参数来启动但实际上并没有去启动一个全新的Activity。维护了几个子View6.ActivityGroup的问题它是用来做Tab切换用的不是用做栈导航的在一个ActivityGroup中连续开启同一个Activity第2个及之后和第1个在创建菜单的函数调用顺序上不同在一个ActivityGroup中连续开启同一个Activity非同一个Activity后面的创建菜单的函数不再调用了...另外也没有StartActivityForResult函数。ActivityGroup中可以指定界面中的各个部分内容来自不同的Activity这时这些Actvitiy只作为内容管理单元。NavHostFragmentNavHostFragment 是 Android Jetpack Navigation 组件里的一个特殊 Fragment用来当作导航的宿主容器负责展示当前应该显示的那个页面也就是导航图里的“目的地”。‌‌ 核心作用‌容器角色‌它是 Activity 和各个 Fragment 之间的“展示窗口”导航图里定义的所有页面都要通过它来显示。‌自动管理‌它会自动帮你处理页面之间的切换、返回栈管理以及转场动画。‌绑定关系‌每个 NavHostFragment 都配有一个 ‌NavController‌NavController 是实际执行导航操作的核心对象。‌‌

相关新闻

UI交互动画从概念到实战:提升产品演示质感的关键技术

UI交互动画从概念到实战:提升产品演示质感的关键技术

2026/9/2 19:26:06

先聊一个真实场景:同样是一套 SaaS 控制台,静态稿看起来功能齐全、界面干净,但一到产品演示阶段,按钮点击有没有反馈、页面切换是否平滑、模块出现有没有节奏,会直接决定观众对“产品完成度”的判断。很多时候功能差异…

懂交互的产品演示:交互动画设计原理与前端实现指南

懂交互的产品演示:交互动画设计原理与前端实现指南

2026/9/2 19:26:06

懂交互的产品演示,不是把界面做得好看,而是在正确的时间点,让用户看到正确的变化。这个变化可能是按钮按下后的微反馈,可能是卡片展开时的转场节奏,也可能是数据加载过程中的引导动画。很多团队做产品演示时&#xff0…

AI编程助手Skill机制解析:从原理到图片生成实战

AI编程助手Skill机制解析:从原理到图片生成实战

2026/9/2 19:16:05

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

自动化测试面试高频问题与实战解答:从UI到接口框架

自动化测试面试高频问题与实战解答:从UI到接口框架

2026/9/2 20:16:08

自动化测试在软件测试面试里几乎躲不掉。西安这边12k左右的测试岗,面试官不会只问你“什么是自动化测试”,更常问的是“你做过哪些自动化”“脚本怎么写的”“框架怎么搭的”“出了问题怎么排查”。这些问题的共同点是:看起来是概念题&#x…

小米YU7提车验车全攻略:从外观到交付单,避开签字后扯皮

小米YU7提车验车全攻略:从外观到交付单,避开签字后扯皮

2026/9/2 20:16:08

提完车再发现问题,是所有人都不想面对的场景。群里有个朋友提小米YU7,等车等了大半年,交付当天心情激动,围着车转了一圈,觉得“看起来没毛病”,签完字就把车开走了。第二天洗车时,才发现引擎盖边…

自动化测试面试高频考点全解析:从概念到工程实践

自动化测试面试高频考点全解析:从概念到工程实践

2026/9/2 20:16:08

最近有准备跳槽的测试同学问我:面一个西安 12k 左右的测试岗,面试官怎么总爱揪着自动化测试问?这其实不是什么个别现象。自动化测试在软件测试面试中早就是高频考点,尤其是薪资到了 10k 以上,如果你只会点点点&#xf…

Gradle 5.6.4下载失败?镜像加速与手动放置全攻略

Gradle 5.6.4下载失败?镜像加速与手动放置全攻略

2026/9/2 20:16:08

简介:Gradle 5.6.4 完整发行包(all 版)是面向 Java 与 Android 开发者的构建工具资源,适合需要离线安装、快速搭建开发环境或学习新版特性的用户。压缩包共两千个文件,主要包含 Java 源码、HTML 帮助文档、Gradle 与 K…

自动化测试面试高频考点:Selenium、接口自动化与Pytest实战解析

自动化测试面试高频考点:Selenium、接口自动化与Pytest实战解析

2026/9/2 20:16:08

1. 为什么自动化测试问题总被面试官反复追问最近不少测试同学反馈,在西安面试 12k 左右的软件测试岗位时,功能测试、数据库、Linux 这些基础题还好,一旦聊到自动化测试,就容易卡壳。有的被问到“Selenium 的显式等待和隐式等待到底…

Tesseract 5.0 Windows源码编译指南:打造完整本地OCR识别环境

Tesseract 5.0 Windows源码编译指南:打造完整本地OCR识别环境

2026/9/2 20:06:07

简介:OCR-Tesseract 5.0编译后完整版本,面向需要快速集成OCR能力的软件开发者、算法工程师及科研人员。该资源基于Google维护的开源OCR引擎Tesseract 5.0编译生成,借助深度学习模型和LSTM/CNN网络,可高效识别中文、英文等百余种语…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

2026/9/2 0:04:59

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

2026/9/2 0:04:59

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

2026/9/2 0:04:59

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

远程协作的工作台整理

远程协作的工作台整理

2026/9/2 6:21:32

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/2 6:21:32

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/2 2:45:06

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…