android tabhost用法详解,android Tabhost部件详解
本文结合源代码和实例来说明TabHost的用法。
使用TabHost 可以在一个屏幕间进行不同版面的切换,例如android自带的拨号应用,截图:
查看tabhost的源代码,主要实例变量有:private TabWidget mTabWidget;
private FrameLayout mTabContent;
private List mTabSpecs
也就是说我们的tabhost必须有这三个东西,所以我们的.xml文件就会有规定:继续查看源代码:if (mTabWidget == null) {
throw new RuntimeException(
"Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'");
}
mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);
if (mTabContent == null) {
throw new RuntimeException(
"Your TabHost must have a FrameLayout whose id attribute is 'android.R.id.tabcontent'");
}
也就是说我们的.xml文件需要TabWidget和FrameLayout标签。
接下来构建我们自己的tab实例:
有两种方式可以实现:
一种是继承TabActivity 类,可以使用android的自己内部定义好的.xml资源文件作容器文件。也就是在我们的代码中使用getTabHost(); , 而相应的后台源码是这样的:this.setContentView(com.android.internal.R.layout.tab_content);
在系统的资源文件中可以看见这个layout
有了容器,然后我们就需要我们为每个tab分配内容,当然要可以是如何类型的标签:
例如我们构建一下.xml文件
首先tab1.xml 是一个LinearLayout布局<?xml version="1.0" encoding="utf-8"?>
android:id="@+id/LinearLayout01" android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:id="@+id/TextView01" android:layout_width="wrap_content"
android:layout_height="wrap_content">
然后是tab2.xml是一个FrameLayout布局<?xml version="1.0" encoding="utf-8"?>
android:id="@+id/FrameLayout02"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:id="@+id/TextView01" android:layout_width="wrap_content"
android:layout_height="wrap_content">
接着要注册这两个FrameLayout为tabhost的Content,也就是接下来的代码:LayoutInflater inflater_tab1 = LayoutInflater.from(this);
inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());
inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());
然后需要构建前面说的tabhost的第三个实例变量对应得内容,源代码中是这样的:private List mTabSpecs = new ArrayList(2);
初始化是两个tab的空间然后会自动扩展:
好 我们构建我们的tabspec:mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 11").setContent(R.id.LinearLayout01));
mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 11").setContent(R.id.FrameLayout02));
也就是把我们的2个layout作为他的content,当然FrameLayout中可以有其他的布局,来放我的组件。
我们不需要在代码里面设置setContentView();因为getTabHost(); 这个方法调用后就已经设置了,源代码:if (mTabHost == null) {
this.setContentView(com.android.internal.R.layout.tab_content);
}
也就是把系统的tab_content当做view设置。
运行后如下:
完整代码:TabHost mTabHost = getTabHost();
LayoutInflater inflater_tab1 = LayoutInflater.from(this);
inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());
inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());
mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 11").setContent(R.id.LinearLayout01));
mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 11").setContent(R.id.FrameLayout02));
还有一种就是定义我们自己的tabhost:不用继承TabActivity首先建立我们自己的.xml文件,当然要包含Tabhost,TabWidget,FrameLayout,着3个标签:<?xml version="1.0" encoding="utf-8"?>
android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
注意的是:除了tabhost的id可以自定义外,其他的必须使用系统的id,为什么后面说,
当然我们可以在FrameLayout里面添加view来作为tab的内容只需要在create tabspce时候添加就可以了,我们为了把每个tab的内容分开我们依然使用前面用到的两个tab xml文件
java代码:
获取TabHost 通过findviewbyid,setContentView(R.layout.main);
TabHost mTabHost = (TabHost)findViewById(R.id.tabhost);
接下来很重要的一步是要使用TabHost.setup();作用是来初始化我们的TabHost容器:
源代码是这样说的:Call setup() before adding tabs if loading TabHost using findViewById(). However You do
* not need to call setup() after getTabHost() in [email protected] android.app.TabActivity TabActivity}.
也就是说通过findviewbyid,方法获得tabhost必须setup 而通过getTabHost则不用。
setup干什么呢:源代码mTabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs);
if (mTabWidget == null) {
throw new RuntimeException(
"Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'");
}
mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);
if (mTabContent == null) {
throw new RuntimeException(
"Your TabHost must have a FrameLayout whose id attribute is 'android.R.id.tabcontent'");
}
他主要是初始化了tabhost的两个实例变量,这里也回答了为什么我们的id必须使用系统定义的id的原因
接下来工作就和前面相同了:LayoutInflater inflater_tab1 = LayoutInflater.from(this);
inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());
inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());
mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB a").setContent(R.id.LinearLayout01));
mTabHost.addTab(mTabHost.newTabSpec("tab_test2").setIndicator("TAB b").setContent(R.id.FrameLayout02));
完整代码:setContentView(R.layout.main);
TabHost mTabHost = (TabHost)findViewById(R.id.tabhost);
mTabHost.setup();
LayoutInflater inflater_tab1 = LayoutInflater.from(this);
inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());
inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());
mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB a").setContent(R.id.LinearLayout01));
mTabHost.addTab(mTabHost.newTabSpec("tab_test2").setIndicator("TAB b").setContent(R.id.FrameLayout02));
运行结果同上。
android tabhost用法详解,android Tabhost部件详解相关推荐
- android tablelayout用法,TableLayout布局的使用和详解
TableLayout是继linearLayout布局的另一种布局方式,这中布局方式的优点就是布出来的局特别规整,行是行,列是列的. 你可以在自己脑海中脑补一下 把TableLayout想象成一个表格 ...
- android weakreference 用法,WeakReference 在android中的应用
首先我们来看一段代码 public class AutoActivity extends Activity { Handler handler = new Handler(){ public void ...
- android组件用法说明,Android第三方控件PhotoView使用方法详解
Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...
- android studio 导入包分不分动态静态,详解Android studio 动态fragment的用法
fragment的使用时Android的基础,它有两种用法,第一个就是静态的fragment.第二个则是动态的fragment. 静态fragment直接在layout创建你想要的fragment的X ...
- android:stretchcolumns=quot;*quot;,详解Android TableLayout中stretchColumns、shrinkColumns的用法...
详解Android 中TableLayout中stretchColumns.shrinkColumns的用法 android:stretchColumns="1" android: ...
- Android 之窗口小部件详解--App Widget
1 App Widget简介 App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widge ...
- Android 12 小部件详解
来龙去脉 小部件兴起 2020年九月苹果的 iOS 14 正式版本发布,其中的一项重大更新就是苹果也支持小部件了!不容易啊,安卓好多年前拥有的功能现如今苹果终于用上了,先来看看苹果中的小部件样式吧! ...
- android include 控件详解,Android开发中include控件用法分析
本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...
- android 剪贴板服务,Android剪贴板用法详解
本文实例详述了Android剪贴板的用法,分享给大家供大家参考.具体方法分析如下: 这里首先需要注意的一点,就是在使用Android剪贴板的时候大家只记住一点就行了,不管是安卓设备还是PC机,复制粘贴 ...
- Android.mk用法详解
Android.mk是Android提供的一个makefile文件,可以将源文件分组为模块.用来引用的头文件目录.需要编译的*.c/.cpp文件.jni源文件.指定编译生成.so共享库文件或者*.a静 ...
最新文章
- 虚拟机使用镜像文件安装系统
- SBB:不同植被土壤中细菌古菌的群落分布模式比较
- 全球及中国水刀机械行业发展态势及及投资决策建议报告2021年版
- SE16N新改表内容方法!!!
- 一篇不一样的docker原理解析 提高篇
- 东方智慧和西方智慧的比较
- Meta:绝对没有威胁要离开欧洲市场
- linux下命令行操作快捷键及技巧
- Mysql实现企业级数据库主从复制架构实战
- 697.数组的度(力扣leetcode) 博主可答疑该问题
- 做游戏开发,选择Unity还是Unreal?
- gMIS吉密斯导航菜单Navimenu、自动安装等更新
- ios睡眠分析 卧床 睡眠_在HealthKit中用 Swift 进行睡眠分析
- 文献阅读_Radiogenomic analysis of vascular endothelial growth factor in patients with diffuse gliomas
- 每天睡6小时和8小时的区别 看完再不敢熬夜了
- 制作一个简单的选项卡插件
- 【Android系统蓝牙开发】蓝牙基础知识-蓝牙核心系统架构
- 毛永胜计算机教师,呼和浩特市小学信息技术学科基本功获奖教师展示课活动
- 什么是悲观锁和乐观锁,及分布式锁的实现方式
- tplink控制上网设备_TP-LINK无线路由器怎么设置限制别人wifi网速
热门文章
- win服务器接她tar.gz文件,Window平台下压缩文件为tar.gz格式的方法
- 消防物联网,为逆行英雄守住第一道生命线
- linux下thinkpad X1 carbon 2018 电源管理
- Exchange2010删除指定账户指定主题邮件
- [译]区块链技术全解析入门版
- powerdesigner 16.5 Could not Initialize JavaVM!
- Python:用类与对象写一元二次方程计算器中遇到的错误
- 机器学习 高维数据可视化
- Java实现日历小程序【代码】
- 明清时期中央朝廷与地方关系中的江南著姓望族