Android(java)学习笔记129:Tab标签的使用

1.案例1---TabProject

(1)首先是main.xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent"
 6      android:background="@drawable/bg2"
 7     >
 8     <Button
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content"
11         android:text="This is Tab1"
12         android:id="@+id/btn"
13         />
14     <EditText
15         android:layout_width="fill_parent"
16         android:layout_height="wrap_content"
17         android:text="This is Tab2"
18         android:id="@+id/et"
19         />
20     <LinearLayout
21         android:orientation="vertical"
22         android:layout_width="fill_parent"
23         android:layout_height="fill_parent"
24         android:id="@+id/mylayout"
25         android:background="@drawable/bg"
26         >
27         <Button
28             android:layout_width="fill_parent"
29             android:layout_height="wrap_content"
30             android:text="This is Tab3"
31             />
32         <EditText
33             android:layout_width="fill_parent"
34             android:layout_height="wrap_content"
35             android:text="This is Tab3"
36             />
37     </LinearLayout>
38 </LinearLayout>

(2)然后是MainActivity.java文件:

 1 package com.tab;
 2
 3 import android.app.TabActivity;
 4 import android.os.Bundle;
 5 import android.view.LayoutInflater;
 6 import android.widget.TabHost;
 7 import android.widget.Toast;
 8 import android.widget.TabHost.OnTabChangeListener;
 9 import android.widget.TabHost.TabSpec;
10
11 public class MainActivity extends TabActivity implements OnTabChangeListener {
12     private TabSpec ts1, ts2, ts3;//声明3个分页
13     private TabHost tableHost;//分页菜单(tab的容器)
14     @Override
15     public void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         tableHost = this.getTabHost();//实例(分页)菜单,getTabHost()這是TabActivity方法,获取TabHost实例
18
19         //利用LayoutInflater将布局与分页菜单一起显示
20         //from是LayoutInflater的静态方法,LayoutInflater.from(this),this表示当前MainActivity
21         //在当前context下获取LayoutInflater的实例,从而可以调用inflate方法
22         //inflate(参数1,参数2):参数1表示需要加载的布局文件id,参数2表示附加在resource资源文件的根控件
23         LayoutInflater.from(this).inflate(R.layout.main, tableHost.getTabContentView());
24         //分别给ts1,ts2,ts3分页进行设置,绑定资源
25         ts1 = tableHost.newTabSpec("tabOne");//实例化一个分页,这里"tabOne"这个标签ID绑定分页1,实现下面的接口实现操作
26         ts1.setIndicator("Tab1")//设置此分页显示的标题,字母会大写显示
27         .setContent(R.id.btn);//设置此分页的资源id
28
29         ts2 = tableHost.newTabSpec("tabTwo");
30         //设置此分页显示的标题和图标
31         ts2.setIndicator("Tab2", getResources().getDrawable(R.drawable.icon))
32         .setContent(R.id.et);
33
34         ts3 = tableHost.newTabSpec("tabThree");
35         ts3.setIndicator("Tab3")
36         .setContent(R.id.mylayout);//设置此分页的布局id
37
38         tableHost.addTab(ts1);//菜单中添加ts1分页
39         tableHost.addTab(ts2);//菜单中添加ts2分页
40         tableHost.addTab(ts3);//菜单中添加ts3分页
41
42
43         tableHost.setOnTabChangedListener(this);
44     }
45     @Override
46     public void onTabChanged(String tabId) {
47         if (tabId.equals("tabOne")) {//ts1 = tableHost.newTabSpec("tabOne");
48             Toast.makeText(this, "分页1", Toast.LENGTH_LONG).show();
49         }
50         if (tabId.equals("tabTwo")) {
51             Toast.makeText(this, "分页2", Toast.LENGTH_LONG).show();
52         }
53         if (tabId.equals("tabThree")) {
54             Toast.makeText(this, "分页3", Toast.LENGTH_LONG).show();
55         }
56     }
57 }

总结:

(1)这里把main.xml作为一个整体资源进行分配给不同标签分页,当然main.xml中元素的位置不会变化

(2)使用OnTabChangeListener接口,重写OnTabChanged(String tabId)函数

(3)判断OnTabChanged(String tabId)中的tabId参数进行处理事件;这里的tabId对应的是实例中每个分页传入的分页ID,例如ts1的ID为:

tableHost.newTabSpec("tabOne"),而不是TabSpec.setIndicatior()设置的标题。

2.案例2---TabTest

(1)首先是activity_main.xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:id="@android:id/tabhost"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent" >
 6
 7     <RelativeLayout
 8         android:layout_width="fill_parent"
 9         android:layout_height="fill_parent"
10         android:orientation="vertical" >
11
12         <TabWidget
13             android:id="@android:id/tabs"
14             android:layout_width="fill_parent"
15             android:layout_height="wrap_content"
16             android:layout_alignParentBottom="true" >
17         </TabWidget>
18
19         <FrameLayout
20             android:id="@android:id/tabcontent"
21             android:layout_width="fill_parent"
22             android:layout_height="wrap_content" >
23
24             <TextView
25                 android:id="@+id/textview1"
26                 android:layout_width="fill_parent"
27                 android:layout_height="fill_parent"
28                 android:text="this is a tab" />
29
30             <TextView
31                 android:id="@+id/textview2"
32                 android:layout_width="fill_parent"
33                 android:layout_height="fill_parent"
34                 android:text="this is another tab" />
35
36             <TextView
37                 android:id="@+id/textview3"
38                 android:layout_width="fill_parent"
39                 android:layout_height="fill_parent"
40                 android:text="this is a third tab" />
41         </FrameLayout>
42
43
44
45     </RelativeLayout>
46
47 </TabHost>  

(2)其次是MainAcitivity.java文件:

  1 package com.dream.tabtest;
  2 import java.util.ArrayList;
  3 import java.util.List;
  4
  5 import android.app.TabActivity;
  6 import android.graphics.Color;
  7 import android.os.Bundle;
  8 import android.view.Gravity;
  9 import android.view.View;
 10 import android.widget.ImageView;
 11 import android.widget.LinearLayout;
 12 import android.widget.TabHost;
 13 import android.widget.TabHost.OnTabChangeListener;
 14 import android.widget.TextView;
 15
 16 @SuppressWarnings("deprecation") //deprecation:过期的,@SuppressWarnings("deprecation"):表示不检测过期的方法
 17 public class MainActivity extends TabActivity {
 18
 19     //声明TabHost对象
 20         TabHost mTabHost;
 21         public List<ImageView> imageList = new ArrayList<ImageView>();
 22         /** Called when the activity is first created. */
 23         @Override
 24         public void onCreate(Bundle savedInstanceState)
 25         {
 26             super.onCreate(savedInstanceState);
 27             setContentView(R.layout.activity_main);
 28
 29             //取得TabHost对象
 30             mTabHost = getTabHost();
 31
 32             /* 为TabHost添加标签 */
 33             //新建一个newTabSpec(newTabSpec)
 34             //设置其标签和图标(setIndicator)
 35             //设置内容(setContent)
 36             mTabHost.addTab(mTabHost.newTabSpec("tab_test1")
 37                     .setIndicator(composeLayout("TAB_1", R.drawable.img1))//给tab1一个标签 指示
 38                     .setContent(R.id.textview1));
 39             mTabHost.addTab(mTabHost.newTabSpec("tab_test2")
 40                     .setIndicator(composeLayout("TAB_2", R.drawable.img2))//给tab2一个标签 指示
 41                     .setContent(R.id.textview2));
 42             mTabHost.addTab(mTabHost.newTabSpec("tab_test3")
 43                     .setIndicator(composeLayout("TAB_3", R.drawable.img3))//给tab3一个标签 指示
 44                     .setContent(R.id.textview3));
 45
 46             //设置TabHost的背景颜色
 47             //mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150));
 48             //设置TabHost的背景图片资源
 49             //mTabHost.setBackgroundResource(R.drawable.image1);
 50
 51             //设置当前显示哪一个标签
 52             mTabHost.setCurrentTab(0);
 53             imageList.get(0).setImageDrawable(getResources().getDrawable(R.drawable.img01));
 54
 55             //标签切换事件处理,setOnTabChangedListener
 56             //onTabChanged(String str)的监听,该监听是只有当你切换tab时才会发生动作事件
 57             mTabHost.setOnTabChangedListener(new OnTabChangeListener()
 58             {
 59                 // TODO Auto-generated method stub
 60                 public void onTabChanged(String tabId)
 61                 {
 62                             // 设置所有选项卡的图片为未选中图片
 63                             imageList.get(0).setImageDrawable(getResources().getDrawable(R.drawable.img1));
 64                             imageList.get(1).setImageDrawable(getResources().getDrawable(R.drawable.img2));
 65                             imageList.get(2).setImageDrawable(getResources().getDrawable(R.drawable.img3));
 66
 67                             if (tabId.equalsIgnoreCase("tab_test1")) {
 68                                 imageList.get(0).setImageDrawable(getResources().getDrawable(R.drawable.img01));
 69                                 // 移动底部背景图片
 70                                 //moveTopSelect(0);
 71                             } else if (tabId.equalsIgnoreCase("tab_test2")) {
 72                                 imageList.get(1).setImageDrawable(getResources().getDrawable(R.drawable.img02));
 73                                 // 移动底部背景图片
 74                                 //moveTopSelect(1);
 75                             } else if (tabId.equalsIgnoreCase("tab_test3")) {
 76                                 imageList.get(2).setImageDrawable(getResources().getDrawable(R.drawable.img03));
 77                                 // 移动底部背景图片
 78                                 //moveTopSelect(2);
 79                             }
 80
 81                 }
 82             });
 83         }
 84         /**
 85          * 这个设置Tab标签本身的布局,需要TextView和ImageView不能重合 s:是文本显示的内容 i:是ImageView的图片位置
 86          */
 87         public View composeLayout(String s, int i) {
 88                     // 定义一个LinearLayout布局
 89                     LinearLayout layout = new LinearLayout(this);
 90                     // 设置布局垂直显示
 91                     layout.setOrientation(LinearLayout.VERTICAL);
 92                     ImageView iv = new ImageView(this);
 93                     imageList.add(iv);
 94                     iv.setImageResource(i);
 95                     //设置图片布局
 96                     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, 50);
 97                     lp.setMargins(0, 0, 0, 0);
 98                     layout.addView(iv, lp);
 99                     // 定义TextView
100                     TextView tv = new TextView(this);
101                     tv.setGravity(Gravity.CENTER);
102                     tv.setSingleLine(true);
103                     tv.setText(s);
104                     tv.setTextColor(Color.BLACK);
105                     tv.setTextSize(10);
106                     //设置Text布局
107                     layout.addView(tv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
108                     return layout;
109                 }
110 }  

总结:

所谓的TabHost是提供选项卡(Tab页)的窗口视图容器.

此对象包含两个子对象:一个是使用户可以选择指定标签页的标签的集合TabWidge;TabWidget类似于Android 中查看电话薄的界面,通过多个标签切换显示不同内容。另一个是用于显示标签页内容的 FrameLayout. 选项卡中的个别元素一般通过其容器对象来控制,而不是直接设置子元素本身的值。

时间: 2024-10-24 17:08:02

Android(java)学习笔记129:Tab标签的使用的相关文章

java/android 设计模式学习笔记(4)---抽象工厂模式

再来介绍一下抽象工厂模式(Abstact Factory Pattern),也是创建型模式之一,上篇博客主要介绍了工厂方法模式.抽象工厂模式和工厂方法模式稍有区别.工厂方法模式中工厂类生产出来的产品都是具体的,也就是说每个工厂都会生产某一种具体的产品,但是如果工厂类中所生产出来的产品是多种多样的,工厂方法模式也就不再适用了,就要使用抽象工厂模式了. 抽象工厂模式的起源或者最早的应用,是对不同操作系统的图形化解决方案,比如在不同操作系统中的按钮和文字框的不同处理,展示效果也不一样,对于每一个操作系

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

java/android 设计模式学习笔记(12)---组合模式

这篇我们来介绍一下组合模式(Composite Pattern),它也称为部分整体模式(Part-Whole Pattern),结构型模式之一.组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别.这个最典型的例子就是数据结构中的树了,如果一个节点有子节点,那么它就是枝干节点,如果没有子节点,那么它就是叶子节点,那么怎么把枝干节点和叶子节点统一当作一种对象处理呢?这就需要用到组合模式了. 转

java/android 设计模式学习笔记(9)---代理模式

这篇博客我们来介绍一下代理模式(Proxy Pattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子.代理在我们日常生活中也很常见,比如上网时连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在日常生活中的使用例子. 代理模式中的代理对象能够连接任何事物:一个网络连接,一个占用很多内存的大对象,一个文件,或者是一些复制起来代价很高甚至根本不可能复制的一些资源.总之,代理是一个由客户端调用去访问幕后真正服务的包装对象

java/android 设计模式学习笔记(6)---适配器模式

这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我们的实际生活中也有很多类似于适配器的例子,比如香港的插座和大陆的插座就是两种格式的,为了能够成功适配,一般会在中间加上一个电源适配器,形如: 这样就能够将原来不符合的现有系统和目标系统通过适配器成功连接. 说到底,适配器模式是将原来不兼容的两个类融合在一起,它有点类似于粘合剂,将不同的东西通过一种转

java/android 设计模式学习笔记(16)---命令模式

这篇博客我们来介绍一下命令模式(Command Pattern),它是行为型设计模式之一.命令模式相对于其他的设计模式更为灵活多变,我们接触比较多的命令模式个例无非就是程序菜单命令,如在操作系统中,我们点击关机命令,系统就会执行一系列的操作,如先是暂停处理事件,保存系统的一些配置,然后结束程序进程,最后调用内核命令关闭计算机等,对于这一系列的命令,用户不用去管,用户只需点击系统的关机按钮即可完成如上一系列的命令.而我们的命令模式其实也与之相同,将一系列的方法调用封装,用户只需调用一个方法执行,那