最近在做开发,UI要求设计成TabLayout的形式,没用过,决定从头到尾跟一遍官网上的教程,英文好的可以直接看官方网站。

网址如下: http://developer.android.com/resources/tutorials/views/hello-tabwidget.html

现在用中文理一遍,也按照自己的理解添加一些东西,方便今后查阅。

Tab Layout(就翻译为标签布局吧)

为了创建一个标签布局,需要使用一个TabHost和一个TabWidget。TabHost必须作为布局的根基,它包含了用于显示标签的TabWidget和用于显示标签内容的FrameLayout。

有2种方法可以实现标签中内容的切换。一种是使用标签在同一个Activity在切换Views,还有一种是在完全独立的Activity之间切换。(推荐后者)

本教程中也是每个标签单独使用独立的Activity来实现的。

1.创建一个新的工程叫做 HelloTabWidget,这里面创建的Activity叫Tab
2.首先,在工程中创建3个单独的Activity类(也就是在工程的src下面创建3个java类):
ArtistsActivity,AlbumsActivity,SongsActivity.这3个将各自表示一个单独的标签。
现在呢,先使用TextView让每个类显示一个简单的消息。例如:

public class ArtistsActivity extends Activity {public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);          //前三行都一样,工程自带的,记得在
                                                                      //最前面导入相关的包TextView textview = new TextView(this);
//发现一个问题,以前我一直以为每创建一个Activity必须相应地也要创建一个layout文件,现在发现不是这样,也可以按照这个方法,创建一个简单的TextView,把Context设置为this,设置一个文本值,然后再将这个TextView设置为ContentView.这种个人觉得更加方便测试吧。
textview.setText("This is the Artists tab");setContentView(textview);}
}

注意:这里并没有使用layout文件,只是创建了一个TextView,设定了一些文本并且将它设置为显示内容。接下来在剩下的2个类中做同样的事情,并且在Manifest文件中声明这3个Activity.

3.每个标签需要一个图标,准确的说每个标签需要两个图标,或者说一个图标的2个版本。一个用于标签被选中的时候,一个用于没被选中的时候。通常建议选中的情况用深色(灰色),没选中的用浅色(白色)。

在这个教程里面,可以直接用原文教程里面的图标。但是最终还是得自己创建。

现在创建一个state-list drawable,标明哪种状态用哪个图标。
1)将图标保存在工程的res/drawable/路径
2)在res/drawable/中创建一个新的XML文件叫ic_tab_artists.xml 加入如下代码

<? xmlversion = "1.0" encoding = "utf-8" ?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">  //这一行是必须的,格式固定<!-- When selected, use grey --><item android:drawable="@drawable/ic_tab_artists_grey"    //这个也是必须的,标出资源所在位置android:state_selected="true" />        //state_selected通常就是用于tab<!-- When not selected, use white--><item android:drawable="@drawable/ic_tab_artists_white" />
</selector>

当你的标签状态转换的时候,标签图标就会自动地在所定义好的图片间转换。

4.打开 res/layout/main.xml文件,添加如下代码:

<? xmlversion = "1.0" encoding = "utf-8" ?>

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"android:id="@android:id/tabhost"android:layout_width="fill_parent"android:layout_height="fill_parent"><LinearLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:padding="5dp"><TabWidgetandroid:id="@android:id/tabs"android:layout_width="fill_parent"android:layout_height="wrap_content" /><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="fill_parent"android:layout_height="fill_parent"android:padding="5dp" /></LinearLayout>
</TabHost>

这个布局会显示标签,并且提供各个Activity间的导航。
TabHost需要一个TabWidget和一个FrameLayout在里面。它们的位置是垂直的,使用的是线性布局(Linear)。
FrameLayout是每个标签内容所在的地方,现在是空白,因为TabHost会自动地把各个Activity嵌入里面。
注意:TabWidget和FrameLayout各自有其IDs,tabs 和 tabcontent.TabHost必须使用这些名字来索引,需要准确的名字。

5.现在打开Tab.java 并且使其扩展TabActivity:
public class Tabextends TabActivity {

6.使用如下代码来实现onCreate()方法:

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Resources res = getResources(); // 获取工程里面的资源的一个实例对象TabHost tabHost = getTabHost();  // The activity TabHostTabHost.TabSpec spec;  // Resusable TabSpec for each tabIntent intent;  // Reusable Intent for each tab // Create an Intent to launch an Activity for the tab (to be reused)intent = new Intent().setClass(this, ArtistsActivity.class); // Initialize a TabSpec for each tab and add it to the TabHostspec = tabHost.newTabSpec("artists").setIndicator("Artists",res.getDrawable(R.drawable.ic_tab_artists)).setContent(intent);tabHost.addTab(spec);
// Do the same for the other tabsintent = new Intent().setClass(this, AlbumsActivity.class);spec = tabHost.newTabSpec("albums").setIndicator("Albums",res.getDrawable(R.drawable.ic_tab_albums)).setContent(intent);tabHost.addTab(spec);intent = new Intent().setClass(this, SongsActivity.class);spec = tabHost.newTabSpec("songs").setIndicator("Songs",res.getDrawable(R.drawable.ic_tab_songs)).setContent(intent);tabHost.addTab(spec);tabHost.setCurrentTab(2);}

这个程序为每个标签创建了文本和图标,并且为每个标签分配了Activity。
首先通过getTabHost()获得TabHost的关联,然后,对于每一个标签,创建一个TabHost.TabSpec来定义标签的属性。newTabSpec(String)方法创建一个新的TabHost.TabSpec(),它通过已知的字符标记来指定。对于每一个TabHost.TabSpec,都要调用setIndicator(CharSequence,Drawable)来为标签设定文本和图标,并且调用setContent(Intent)来指定Intent,从而启动对应的Activity.每个TabHost.TabSpec都是通过调用addTab(TabHost.TabSpec)被添加到TabHost里面。

最后,通过指定索引位置,setCurrentTab(int)启动默认被打开的标签。

注意:TabWidget不止一个被用到,因为TabWidget必须一直是TabHost的子集。因此,当一个标签被添加到TabHost,它自动地被添加到TabWidget的子集。

7.现在打开Manifest文件,将NoTitleBar主题添加到Tab的activity中,

<activity android:name=".HelloTabWidget" android:label="@string/app_name"android:theme="@android:style/Theme.NoTitleBar">

8.运行应用

Tab Layout教程相关推荐

  1. PCB天线设计 之 HFSS 导出天线文件, Altium 中天线封装及天线layout教程

    1. 前言: 随着无线通信的发展,以及集成电路技术的发展提升.各种无线通信设备越来越多,WiFi.蓝牙等无线设备随处可见.无线设备中的通信关键器件-天线 也越来越重要.对于一些无线电子产品,板载PCB ...

  2. UICollectionView自定义Layout教程

    本文来自RAYWENDERLICH网站,上面有一系列的IOS教程,都写得十分精彩,大家可以上去看看.本文对于原文有所删改.因为Swift的语法进行了更新,打开工程的时候会提示更新语法,点击是就行了. ...

  3. 前端开发系列(十六)网页布局教程(2)

    一. 结构与表现相分离的思想 1.1.微博用户发言信息列表制作 代码示例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...

  4. android底部tab页动画,Android仿微信底部实现Tab选项卡切换效果

    在网上看了比较多的关于Tab的教程,发现都很杂乱.比较多的用法是用TitlePagerTabStrip和ViewPaper.不过TitlePagerTabStrip有个很大的缺陷,Tab里面的内容刚进 ...

  5. android启动界面修改工具,安卓 软件界面修改 修改安卓启动界面

    安卓软件怎样修改能透明到桌面? 修改安卓APP界面布局步骤:File --> New --> android xml file,选择 一个最外层的容器,输入名字便可创建. 可以复制一个已有 ...

  6. python3GUI--天气预报小工具By:PyQt5(附源码)

    文章目录 一.准备工作 二.预览 1.启动 2.添加城市 三.设计流程 1.UI设计(草图) 2.UI设计(QT设计师) 3.解释 四.源代码 五.总结 之前用tk写过一款python3GUI–天气预 ...

  7. 25000字总结Android优秀的第三方框架、各种学习资料汇集 一 系统组件、Design组件、自定义组件等等

    说明 以下内容博主很多也没有用过 分享出来大家一起学习 用到的时候 可以来查看 有问题可以沟通 希望大家不要污染了学习环境 如果觉得有帮助 点个赞 支持一下 系统控件 TextView Github ...

  8. (0060)iOS开发之iOS 9: UIStackView入门

    iOS 9: UIStackView入门 UIStackView 同iOS以往每个迭代一样,iOS 9带来了很多新特性.UIKit框架每个版本都在改变,而在iOS 9比较特别的是UIStackView ...

  9. iOS 9: UIStackView入门

    同iOS以往每个迭代一样,iOS 9带来了很多新特性.UIKit框架每个版本都在改变,而在iOS 9比较特别的是UIStackView,它将从根本上改变开发者在iOS上创建用户界面的方式.本文将带你学 ...

  10. 七种布局显示方式效果及实现

    我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用"Hello World!"程序来实践证明了.在继续深入Android开发之旅之前,有必要解决前两 ...

最新文章

  1. cmd运行Java中文乱码,无法加载主类Error: Could not find or load main class
  2. Meta AI发布图音文大一统模型Data2vec,4天在GitHub揽1.5万星
  3. python除号的乘法加括号_乘除法添加括号规则
  4. Python 的 sys 模块常用方法
  5. Linux中xml导入数据库,XML数据库 BaseX
  6. Python实验项目1例:使用进程池统计指定范围内素数的个数
  7. Qt文件打包_vortex_新浪博客
  8. 【液晶模块系列基础视频】4.5.X-GUI图形界面库-进度条等函数简介
  9. PAT 1005 继续(3n+1)猜想
  10. nbu备份mysql_NBU之 SQL 的备份和恢复
  11. SQL面试经典题(含答案)
  12. 思科交换机配置远程登录命令
  13. 记录第二次进行的助教培训-评分
  14. 基于Tensorflow深度学习的ECG身份识别方法(二)
  15. java 线程池超时_Java定时线程池停止超时任务
  16. 4PCS、super4PCS粗配准算法理解
  17. 据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)
  18. “驱动人生”升级通道传木马,技术分析报告来了
  19. [Study]Vue
  20. CSAPP:第二章——信息的表示和处理

热门文章

  1. 利用vCard实现电子名片扫码将个人信息保存到通讯录
  2. Visual Studio 2012 下载地址 V11各种版本官方下载网址
  3. java中的创建和调用_如何在Mirth Connect中创建和调用自定义Java代码
  4. 51单片机+ESP8266-01WIFI模块实现数据传输
  5. 无法确认设备和计算机之间的连接,代码45的8种解决方法 - 硬件设备没有连接到计算机...
  6. 一篇文章详细解读Spring的AOP原理过程(Spring面向切面详解)
  7. 字节跳动 IconPark 免费图标库、阿里巴巴矢量图标库
  8. MPI 初认识 (入门教程)
  9. linux 服务 优先级,设置Linux自启服务以及优先级
  10. 3DMax VRay 渲染笔记