Tab布局是手机应用中常见的布局方式之一。利用tab,将相对窄小的手机屏幕在视觉上扩张出几倍大,且留下吸引用户点击的线索,的确是个经典的设计(比PC上经典!)。Android上,一般的Tab布局像这个样子——
实现Tab的做法很简单。Layout代码如下——
<!--l version="1.0" encoding="utf-8-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:id="@+id/tv1" android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<TextView android:id="@+id/tv2" android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<TextView android:id="@+id/tv3" android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<TextView android:id="@+id/tv4" android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
</TabHost>
</LinearLayout>
灰色字体部分不用太关心,它的作用是在布局里面放几个TextView,当点击tab时,在界面上呈现出对应的一个。TextView的话题留到以后再谈。继续说tab。Java代码——
package com.ghstudio.samples;
import android.app.TabActivity;
import android.os.Bundle;
import android.widget.TabHost;
public class tabActivity extends TabActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupTabs();
}
private void setupTabs(){
TabHost mTabHost = getTabHost();
mTabHost.addTab(mTabHost.newTabSpec("tab_1").setIndicator(
"Tab 1").setContent(R.id.list_1));
mTabHost.addTab(mTabHost.newTabSpec("tab_2").setIndicator(
"Tab 2").setContent(R.id.list_2));
mTabHost.addTab(mTabHost.newTabSpec("tab_3").setIndicator(
"Tab 3").setContent(
R.id.list_3));
mTabHost.addTab(mTabHost.newTabSpec("tab_4").setIndicator(
"Tab 4").setContent(
R.id.list_4));
}
}
setupTabs()方法简单地向TabHost上添加了4个tab,请记住第一个tab上的文字是tab_1。对于初学者,在使用addTab增加tab后,就只能听之任之,无法在运行时加以修改。不过,那也太死板了。让我们稍微深入一点,在运行时修改tab的呈现吧!
应用场景:点击某个tab时,不但切换到相应的tab,而且该被选中tab上的文字变为“Hello !”,字体颜色为红色,而其他非选中tab上的文字变为“Bye!”,字体颜色为白色。
背景知识:首先你要了解布局xml文件里面的层次。可以看到TabHost下面,有一个LinearLayout,再下一层是用来呈现4个tab的TabWidget。与这个LinearLayout同级的是一个FrameLayout,下面是四个TextView。啰哩吧嗦这一堆,无非就是想说明,要玩转TabHost,必须找到这个TabWidget,而布局文件提供了找到它的层级线索。
背景知识二:TabWidget是一个封装的widget,里面还有乾坤。看了后面的代码,你就知道,TabWidget里面有个RelativeLayout,然后是两个同级的View:一个ImageView,用来放图标;一个TextView,用来显示文字。我们要做的,就是找到这个TextView,然后在代码中修改它的属性。
好,代码来了——
package com.ghstudio.samples;
import android.app.TabActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.TabHost.OnTabChangeListener;
public class tabActivity extends TabActivity {
TabHost mTabHost;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupTabs();
}
private void setupTabs(){
mTabHost = getTabHost();
mTabHost.addTab(mTabHost.newTabSpec("tab_1").setIndicator(
"Tab 1").setContent(R.id.tv1));
mTabHost.addTab(mTabHost.newTabSpec("tab_2").setIndicator(
"Tab 2").setContent(R.id.tv2));
mTabHost.addTab(mTabHost.newTabSpec("tab_3").setIndicator(
"Tab 3").setContent(
R.id.tv3));
mTabHost.addTab(mTabHost.newTabSpec("tab_4").setIndicator(
"Tab 4").setContent(
R.id.tv4));
mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String tabTag) { // tab选中状态变更时
int tabId = mTabHost.getCurrentTab();
changeTab(tabId);
}
});
}
private void changeTab(int tabId){
LinearLayout ll=(LinearLayout)mTabHost.getChildAt(0);
TabWidget tw=(TabWidget)ll.getChildAt(0);
// 以上两行代码,找到TabWidget
int tabCount=tw.getChildCount();
for (int i=0;i RelativeLayout rl=(RelativeLayout)tw.getChildAt(i);
TextView tv=(TextView)rl.getChildAt(1);
// 以上两行代码,找到要修改属性的TextView
String tabLabel="Bye!";
int color=Color.WHITE;
if (i==tabId){ // 如果是选定tab,则修改之
tabLabel="Hello!";
color=Color.RED;
}
tv.setText(tabLabel);
tv.setTextColor(color);
//以上两行代码,修改TextView的属性
}
}
}
运行截图——
当然你还可以继续玩TabHost。了解层级关系,并且逐层得到各种view后,要怎么玩,还不是你说了算。比如,修改每个tab(实际上就是一个RelativeLayout)的背景图片(用setBackground方法),或者做其它事。关于TabHost,以后我还会继续给出更深入的玩法,这篇文章,就算个开始吧。
分享到:
相关推荐
【精选】2009-2010学年度潍坊市高密初段第一学期七年级期中考试--初中政治.doc
【精选】2009-2010学年度潍坊市昌邑市初段第一学期九年级期中考试--初中政治.doc
CG教程_数位板篇初段1
自动领读:出题时系统自动朗读题目,孩子学习生词时可以采用此模式,先听系统读后自己学。 ... 人机对话场景:在语文训练时如果环境条件优越可以开启此选项,会使用系统语音识别引擎分析孩子读音的正确性,自动判断对错...
课程分为了SwiftUI开发的基础部分与进阶部分,基础部分详细的帮助同学们进行课程的准备,以及初段课程与知识储备的讲解。进阶部分则风格直转,完全进入实战开发的状态,课程的安排可以极大的帮助同学们积累实战经验...
目前能找到的AI最好的围棋人机对弈程序,有10级到业余初段的棋力(小岛高穗九段认定),实际游戏中可以体会,本人作了个测试将让手谈V和其他能找到的电脑围棋软件下了几盘棋,其他的软件,基本上不是对手,特别是...
职业段位从低到高依次是职业初段、职业二段、……、职业九段;业余段位分为级和段两个阶段,水平从低到高依次是10级、…、2级、1级、业余1段、…、业余8段。 (4)示例的棋手信息如下: P002,柯洁,职业,职业九段...
将职责分配到对象中去(OOP初段) 将对象的职责单一化(OOP中级) 降低对象与对象之间的耦合度(OOP高级)
冲击地压已成为严重威胁煤矿安全生产的重大自然...本文以该矿调整大煤柱方案为研究对象,分析了不同开采方案的可行性,论证了不同宽度煤柱下技术经济比较,并以此研究了大煤柱留设的合理性及恢复生产初段的安全回采措施。
人与电脑对战,电脑对手还可以分成好几个级别,如原暗棋大师2000里,分成了九级(段),'每个级别还定义了一个对应的好听的名称,初段: 棋童,九段: 暗棋大师每个电脑对手,就分别是不同的级别,用小黄星来表示。...
对于跟踪雷达跟踪高速目标(卫星发射初段),回波信号脉压后存在时频耦合现象,引起距离走动。为了保证跟踪距离精度,采用了脉冲压缩速度补偿技术,消除距离偏差。通过实例与仿真分析,实现了跟踪距离精度要求。因此...