TimerPickerDialog:修改时间对话框,效果如下:
图-1
1、OnTimeSetListener
作用:监听图-1中set按钮的单击事件。该接口声明了如下方法:
void onTimeSet(TimePicker view, int hourOfDay, int minute);
参数说明:
第一个参数-view:当前的TimePicker对象。
第二个参数-hourOfDay:设置的小时的值。
第三个参数-minute:设置的分钟的值。
2、public TimePickerDialog(Context context,
OnTimeSetListener callBack,
int hourOfDay, int minute, boolean is24HourView)
作用:构造方法。
参数说明:
第一个参数-context:上下文对象,存放当前Activity对象。
第二个参数-callback:实现了OnTimeSetListener接口的对象。在该对象的onTimeSet方法中编写用户单击图-1中set按钮时的代码。
第四个参数-hourOfDay:设置的小时的值。
第五个参数-minute:设置的分钟的值。
第六个参数-is24HourView:是否按24小时格式显示数字。
//创建TimePickerDialog对象,设置时间为21点30分,按24小时格式显示时间
TimePickerDialog dialog=new TimePickerDialog(this, new OnTimeSetListener() {
//实现响应用户单击set按钮的事件方法
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Toast.makeText(MainAct.this, "TimePicker", 3000).show();
}
}, 21, 30, true);
dialog.show();//显示设置时间对话框
DatePicker:修改日期对话框,效果如图-2所示:
图-2
1、OnDateSetListener接口
作用:监听用户单击图-2中set按钮,该接口定义了如下方法
void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth);
作用:响应用户单击图-2中set按钮的事件。
参数说明:
第一个参数-view:当前的DatePicker对象。
第二个参数-year:图-2中的年份值。
第三个参数-monthOfYear:图-2中的月份值。
第四个参数-dayOfMonth:图-2中的日的值。
2、DatePickerDialog(Context context,
OnDateSetListener callBack,
int year,
int monthOfYear,
int dayOfMonth)
参数说明:
第一个参数-context:上下文对象
第二个参数-callBack:实现OnDateSetListener接口的对象。
第三个参数:图-2中的年份值。
第四个参数:图-2中的月份值。
第五个参数:图-2中的日的值。
//创建日期设置对话框对象,设置日期为2011年11月20日
DatePickerDialog dialog=new DatePickerDialog(MainAct.this,
new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
Toast.makeText(MainAct.this, "DatePicker", 3000).show();
}
}, 2011, 11, 20);
dialog.show();//显示日期设置对话框
某些情况下,有的类的实例只需要一个,比如一台计算机可以连几个打印机,但这台计算机的打印程序只能有一个,即在整个打印过程中只有一个打印程序的实例。这里就可以通过单例模式来避免两个打印作业同时输出到打印机中的现象。
单例模式的作用就是保证在整个应用程序的生命周期中,任何一个时刻,类的实例都只存在一个。
单例模式的三个特点:
1.类只有一个实例
2.类自行创建实例(在该类内部创建自身的实例对象)
3.向整个系统公开这个实例接口
图-1是单例模式的示意图:
图-3
按照图-1所示,创建单例模式的步骤:
步骤1、创建类,将构造方法私有化,即不允许外部程序调用构造方法来创建本类的实例。
步骤2、创建一个私有的静态的本类的实例,即在类的内部创建类的实例。
步骤3、定义一个公有的静态方法,该方法返回步骤2创建的实例。
以下是两种单例模式的实现方式:
所谓饿汉式,就是以上介绍的单例模式实现步骤,示例代码:
//定义Singleton类
class Singleton {
//创建一个私有的静态的对象
private static Singleton instance=new Singleton();
//构造方法私有化,禁止外部程序创建本类的实例
private Singleton(){}
//提供一个共有的静态方法,允许外部程序调用已创建好的对象
Public static Singleton getInstance() {
return instance;
}
}
懒汉式-顾名思义就是先不着急创建类的实例(懒得创建),什么时候外部创建调用本类的实例,再创建对象。而饿汉式就好比一个人饿得很,一开始就先创建好类的实例。
懒汉式的优势是节省内存空间,在外部程序调用本类实例的情况下,才创建对象。示例代码如下所示:
class Singleton {
//初始为null,暂不实例化
private static Singleton instance=null;
//构造方法私有化,禁止外部程序调用
private Singleton(){}
//提供一个外部程序能调用的方法
static Singleton getInstance() {
//首先判断:若本类的实例不存在,才创建对象
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
工具类是一种比较特殊的类,该类为其它类提供公共的方法,常量值,公共类不需要外部继承或实例化。
1、将公共类定义类公有的、终态类。
2、将构造方法定义为私有的,不允许外部程序创建本类的实例。
3、将方法定义为公有、静态的方法。
4、将常量定义为公有、静态、终态。
以下定义一个工具类,代码如下所示:
package com.tarena.exer14_02;
///CommonUtils类:公共类
public final class CommonUtils {
//定义供外部程序使用的常量
public static final int FLAG_BEGIN=1;
public static final int FLAG_FINISHED=2;
//将构造方法私有化,不允许外部程序创建本类的实例
private CommonUtils(){}
//创建公有的静态方法,供外部程序调用
public static int add(int i, int j)
{
return i + j;
}
}
EditText控件有一个属性InputType,该属性设置文本的类型,用于帮助输入法显示合适的键盘类型。
属性值 |
作用 |
none、text、textCapCharacters |
字母大小 |
textCapWords |
单词首字母大小 |
textCapSentences |
仅第一个字母大小 |
textAutoCorrect、textAutoComplete |
自动完成 |
textMultiLine |
多行输入 |
extImeMultiLine |
输入法多行(如果支持) |
textNoSuggestions |
不提示 |
textEmailAddress |
电子邮件地址 |
textEmailSubject |
邮件主题 |
textShortMessage |
短信息 |
textLongMessage |
长信息 |
textPersonName |
人名 |
textPostalAddress |
邮政地址 |
textPassword |
密码 |
textVisiblePassword |
可见密码 |
textWebEditText |
作为网页表单的文本 |
textFilte |
文本筛选过滤 |
textPhonetic |
拼音输入 |
numberSigned |
有符号数字格式 |
numberDecimal |
可带小数点的浮点格式 |
phone |
电话号码 |
datetime |
时间日期 |
date |
日期 |
time |
时间 |
在图-4所示的界面中分别设置以下类型的编辑框:
1、输入人的姓名
2、输入密码
3、输入email地址
4、输入数字
5、输入地址
6、多行文本编辑
图-4中显示了输入数字编辑框为当前焦点时,Android系统自动显示输入数字的键盘。
图-4
以下是图-4界面的XML代码,该代码位于项目的res/layout/main.xml文件中。
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:id="@+id/etPersonName"
android:hint="input Person Name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"/>
<EditText
android:id="@+id/etPassword"
android:hint="input password"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"/>
<EditText
android:id="@+id/etEmailAddress"
android:hint="input email"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"/>
<EditText
android:id="@+id/etNumber"
android:hint="input number"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="number"/>
<EditText
android:id="@+id/etPostalAddress"
android:hint="input postal address"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPostalAddress"/>
<EditText
android:id="@+id/etMultiLine"
android:hint="multi lines"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"/>
LinearLayout>
Gallery(画廊)控件与Spinner类相似,都是AbsSpinner类的子类。它们之间的区别在于:Spinner显示的是一个垂直列表选择框,而Gallery显示的是一个水平列表选择框,并且Gallery允许用户水平拖动列表框。
ListView是垂直列表,Gallery可以理解为是水平列表。
XML属性 |
相关方法 |
说明 |
Gravity |
setGravity(int) |
设置对齐方式 |
Spacing |
setSpacing(int) |
设置列表项之间的间距 |
unselectedAlpha |
setUnselectedAlpha(float) |
设置未选中的列表项的透明度 |
1、OnItemClickListener接口:监听列表项单击事件。该接口定义了如下方法:
2、void onItemClick(AdapterView> parent, View view, int position, long id);
作用:响应用户单击列表项的事件。
参数说明:
第一个参数-parent:当前的Gallery对象。
第二个参数-view:被单击的列表项。
第三个参数-position:被单击的列表项在列表中的位置(索引值)。
第四个参数-id:被单击的列表项在列表中所在列的索引值。
3、void setOnItemClickListener(OnItemClickListener listener)
作用:设置响应用户单击事件的方法。
参数说明:
Listener:实现了OnItemClickListener接口的对象。
4、setLayoutParams(ViewGroup.LayoutParams params(int width,int height));
作用:设置控件的宽度和高度。
参数说明:
Params是ViewGroup.LayoutParams类型,ViewGroup是容器类型的控件,如LinearLayout等类。
提示:以下常量与XML中设置控件尺寸的值相对应
android.view.ViewGroup.LayoutParams.MATCH_PARENT:填充父容器android.view.ViewGroup.LayoutParams.FILL_PARENT:填充父容器
android.view.ViewGroup.LayoutParams.WRAP_CONTENT:随内容变化
示例代码:
//设置gallery控件的宽度和高度
gallery.setLayoutParams(new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.MATCH_PARENT,85));
说明:其中宽度设置为填充父容器,高度是85dp。
Gallery控件在使用步骤上与ListView、GridView控件相同
步骤1、在main.xml中设置Gallery控件。
步骤2、创建gallery_item.xml文件,在该文件中设置列表项的显示样式。
步骤3、在Activity.onCreate()方法中示例化Gallery控件。
步骤4、创建适配器对象(如SimpleAdapter),创建方式与ListView的适配器相同。
步骤5、设置Gallery对象与适配器对象相关联。
创建图-5所示的效果,在窗口中显示一个可横向拖动的画廊,单击其中的某个列表项,将显示该列表项所代表的城市。
图-5
步骤1、在main.xml文件中设置Gallery控件-打开项目所在的res/layout/main.xml,输入如下代码:
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Gallery
android:id="@+id/gallery"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:unselectedAlpha="0.6"
android:spacing="2dp"/>
LinearLayout>
步骤2、创建Gallery列表项的显示样式-在res/layout文件夹下创建gallery_item.xml文件,该文件中设置了图-5画廊的每个列表项的显示样式(显示样式为上图下字,上面是ImageView,下面是TextView),代码如下所示:
xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/ivPhoto"
android:layout_width="85dp"
android:layout_height="63dp"
android:src="@drawable/beijing"/>
<TextView
android:id="@+id/tvName"
android:text="北京"
android:layout_width="85dp"
android:layout_height="wrap_content"
android:textSize="20sp"
android:gravity="center_horizontal"/>
LinearLayout>
步骤3、在src/项目包下创建一个工具类,该类负责将四个城市的图片、名称存放在List集合中,代码如下所示:
//CommonUtils-工具类,不允许被继承和实例化
public final class CommonUtils {
//将构造方法私有化,不允许外部程序实例化
private CommonUtils(){}
//photoId数组:存放 四个城市的图片资源索引值
public static final int[] photoId={R.drawable.beijing,R.drawable.tianjing,
R.drawable.shanghai,R.drawable.chongqing
};
//存放四个城市的名称
public static final String[] names={"北京","天津","上海","重庆"};
//存放适配器中要用到的键名数组
public static final String[] keyName={"photoI","name"};
//存放适配器中要用到的显示列表项的两个控件的资源索引值
public static final int[] values={R.id.ivPhoto,R.id.tvName};
//将四个城市的图片、名称存放在list集合中并返回该集合
public static final List
Listnew ArrayList
Map
for (int i = 0; i < names.length; i++) {
item=new HashMap
item.put(keyName[0], photoId[i]);
item.put(keyName[1], names[i]);
list.add(item);
}
return list;
}
}
步骤4、在Activity.onCreate方法中实例化一个Gallery对象,然后创建一个SimpleAdapter对象,然后将画廊对象与适配器对象相关联,最后定义列表项单击事件程序,响应用户单击列表项并显示给该列表项所代表的城市名称。代码如下所示:
public class MainAct extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//实例化画廊控件
Gallery gallery=(Gallery)findViewById(R.id.gallery);
//创建适配器对象
SimpleAdapter adapter=new SimpleAdapter(
this, CommonUtils.getInstance(),
R.layout.gallery_item,
CommonUtils.keyName, CommonUtils.values
);
//设置画廊对象与适配器对象相关联
gallery.setAdapter(adapter);
//定义列表项单击事件
gallery.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view,
int position, long id) {
//显示被单击的列表项代表的城市名称
Toast.makeText(MainAct.this,
CommonUtils.names[position], 3000).show();
}
});
}
}
缩放按钮,实际上是很普通的两个按钮,可以简单的理解为一个ImageButton加上一张缩放的图标。如图-6所示:
图-6
以下是XML中设置ZoomButton控件的代码:
<ZoomButton
android:id="@+id/zoomButton"
android:src="@drawable/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
提示:以上代码的第二行中的mybutton是一个设置了按钮不同状态对应不同的背景图的xml文件,稍后详细介绍。其它属性和方法参见Button控件的介绍。
Selector 是一种背景选择器,也可以用来更改界面状态。当窗口中的控件状态发生改变时,通过在XML中设置selector可以改变控件的显示样式(如背景)。
以下列出Selector的常用属性:
属性名 |
说明 |
default(normal) |
默认状态 |
Pressed |
按下状态 |
Enable |
有效状态(true或false) |
Selected |
被选择状态 |
focus |
焦点状态 |
步骤1、将所需的背景图片复制到res/drawable-mdpi文件夹中。
步骤2、在res文件夹下创建drawable文件夹,在该文件夹中创建xml文件,在该文件夹中设置控件各种状态及所对应的控件样式(如背景图)。
步骤3、在main.xml文件中定义控件时,在控件的drawable属性中设置步骤2所创建的xml文件。
制作图-7a所示的窗口,默认ZoomButton为无焦点、有效状态。
1、 当单击了图-7a中ZoomButton按钮,将出现图-7b的背景图片。
2、 当单击了图-7a中标题为enable/disEnable按钮,将出现图-7c,按钮处于无效状态,此时再按ZoomButton按钮,按钮无响应,仍是图-7c的效果。
提示:enable/disEnable是一个开关按钮,每次单击该按钮,ZoomButton按钮将在有效/无效两种状态之间切换。
图-7a
图-7b 图-7c
步骤1、从chapters/ch14文件夹将所需图片复制到项目的res/drawable-mdpi文件夹下。
步骤2、在res文件夹下创建drawable文件夹,并创建mybutton.xml文件,该文件设置按钮的各种状态所对应的背景图片,代码如下所示:
xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/btn_minus_pressed"/>
<item
android:state_enabled="true"
android:state_focused="false"
android:drawable="@drawable/btn_minus_disable_focused"/>
<item
android:state_focused="true"
android:drawable="@drawable/btn_minus_selected"/>
<item
android:state_focused="false"
android:state_enabled="false"
android:drawable="@drawable/btn_minus_disable"/>
<item
android:drawable="@drawable/btn_minus_default"/>
selector>
步骤2、打开res/layout/main.xml,该文件是图-7a的布局文件,代码如下所示:
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal">
<ZoomButton
android:id="@+id/zoomButton"
android:src="@drawable/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<requestFocus>requestFocus>
ZoomButton>
<Button
android:id="@+id/btnEnbale"
android:text="enable/disEnable"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
LinearLayout>
步骤3、打开MainAct.java,代码如下所示:
public class MainAct extends Activity implements OnClickListener{
ZoomButton mZoomButton;
boolean mEnable=true;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建两个按钮控件
mZoomButton=(ZoomButton)findViewById(R.id.zoomButton);
Button btnEnable=(Button)findViewById(R.id.btnEnbale);
btnEnable.setOnClickListener(this);//注册按钮单击事件
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btnEnbale://btnEable按钮被单击
//设置ZoomButton按钮在有效/无效之间切换
mEnable=!mEnable;
mZoomButton.setEnabled(mEnable);
break;
}
}
}
ScrollView继承自FrameLayout,用于垂直滚动视图中的控件的信息。ScrollView只对一个View起作用,被ScrollView包含的控件,即使是象GridView这样的显示多行多列信息的控件,也只能显示一行,其余行的信息通过鼠标垂直滚动显示。
若想在ScrollView中包含多个控件,可将这些控件放在一个布局中。
当内容在一屏无法显示完整,通过ScrollView可以实现滚屏显示。
scrollbarThumbVertical |
设置滚动条颜色 |
scrollbarTrackVertical |
设置滚动条颜色 |
提示:以上两个属性可以设置滚动条带两种颜色。
实现以下窗口中的效果,窗口中有八个TextView控件,但当前的ScrollView的高度只有100dp,不能完整显示这八个控件。通过滚动窗口实现这些控件的显示。注意:右边的滚动条设置为黄蓝两种颜色。
图-8
代码如下所示:
xml version="1.0" encoding="UTF-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:scrollbarThumbVertical="@drawable/blue"
android:scrollbarTrackVertical="@drawable/yellow"
android:layout_width="match_parent"
android:layout_height="100dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="text1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="text2"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="text3"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="text4"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="text5"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="text6"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="text7"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="text8"/>
LinearLayout>
ScrollView>
HorizontalScrollView除只支持水平滚动外,其他都和ScrollView一样。在HorizontalScrollView中可以直接包含多个View。
制作图-9所示的效果,在窗口中有两个控件:标签和按钮,这两个控件横向排列,横向拖动红框中的TextView,直到出现出右边的按钮为止,此时在窗口下方显示蓝、黄两种颜色的水平滚动条。
图-9
代码如下所示:
xml version="1.0" encoding="UTF-8"?>
<HorizontalScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarThumbHorizontal="@drawable/blue"
android:scrollbarTrackHorizontal="@drawable/yellow">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="texttttexttexttexttexttexttexttexttexttexttexttexttext"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="button"/>
LinearLayout>
HorizontalScrollView>
TabHost可以方便地在窗口中放置多个标签页,每个标签页相当于获得了一个与外部容器相同大小的摆放区域。通过这种方式,可以在一个容器里放置更多的控件。如图-10所示:
图-10
1、TabHost getTabHost();
作用:该方法是TabActivity类的方法,用于创建TabHostO(选项卡)对象。
2、addTab();
作用:添加一个选项卡。
3、tabHost.newTabSpec(String tag);
作用:为选项卡指定一个字符串类型的Tag,该Tag用来区分不同的选项卡。
4、setIndicator(String title);
作用:设置选项卡的标题。
5、setContent(int resId);
作用:设置选项卡的显示内容,参数是布局文件或控件的资源索引值。
步骤1、创建FrameLayout布局,该布局中定义多个控件。示例代码(main.xml):
xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/tvTab1"
android:text="tab1 content"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvTab2"
android:text="tab2 content"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvTab3"
android:text="tab3 content"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvTab4"
android:text="tab4 content"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
FrameLayout>
步骤1、创建继承自TabActivity的Activity类。示例代码:
public class MaintActivity extends TabActivity
步骤2、调用TabActivity的getTabHost方法创建TabHost对象,示例代码:
TabHost tabHost=getTabHost();
步骤3、调用LayoutInflater.from(context).inflate将指定的布局作为当前选项卡的显示内容。示例代码:
LayoutInflater.from(this).inflate(
R.layout.main, tabHost.getTabContentView(),true);
步骤4、调用TabHost对象的addTab和newTabSpec方法,创建选项卡,该方法完整声明如下所示:
tabHost.addTab(tabHost.newTabSpec("tab_tag1")
.setIndicator("tab_title")
.setContent(R.id.tvTab1));
说明:
1、以上代码中的”tab_tag1”是选项卡的标签;
2、"tab_title"是选项卡的标题;
3、R.id.tvTab1是main.xml布局中的一个textView控件的资源索引值。
本方式与方式(1)仅在布局文件上有所不同。在布局文件中用
Java代码部分相同,以下仅列出XML中设置布局的代码:
xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/llBeiJing"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal|center_vertical">
<ImageView
android:id="@+id/ivPhoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/beijing"/>
<TextView
android:id="@+id/tvName"
android:textSize="30sp"
android:text="北京"
android:gravity="center_horizontal"
android:layout_width="170dp"
android:layout_height="wrap_content"/>
LinearLayout>
<LinearLayout
android:id="@+id/llTianJin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal|center_vertical">
<ImageView
android:id="@+id/ivPhoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/tianjin"/>
<TextView
android:id="@+id/tvName"
android:textSize="30sp"
android:text="天津"
android:gravity="center_horizontal"
android:layout_width="170dp"
android:layout_height="wrap_content"/>
LinearLayout>
<LinearLayout
android:id="@+id/llShangHai"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal|center_vertical">
<ImageView
android:id="@+id/ivPhoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/shanghai"/>
<TextView
android:id="@+id/tvName"
android:textSize="30sp"
android:text="上海"
android:gravity="center_horizontal"
android:layout_width="170dp"
android:layout_height="wrap_content"/>
LinearLayout>
<LinearLayout
android:id="@+id/llChongQing"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal|center_vertical">
<ImageView
android:id="@+id/ivPhoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/chongqing"/>
<TextView
android:id="@+id/tvName"
android:textSize="30sp"
android:text="重庆"
android:gravity="center_horizontal"
android:layout_width="170dp"
android:layout_height="wrap_content"/>
LinearLayout>
TabHost>
说明:以上在
在setContent方法中用一个Intent方法指定跳转的目标Activity,该Activity作为选项卡的显示内容。创建步骤如下所示:
步骤1、创建一个布局文件beinjing.xml,该文件用于显示一个图片和城市名称:北京。代码如下所示:
xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal|center_vertical">
<ImageView
android:id="@+id/ivPhoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/beijing"/>
<TextView
android:id="@+id/tvName"
android:textSize="30sp"
android:text="北京"
android:gravity="center_horizontal">
</LinearLayout
步骤2、创建BeiJingActivity.java类,该类中显示beijing.xml布局内容,代码如下所示:
public class BeiJingActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.beijing);
}
}
步骤3、在MainAct.java中编写创建选项卡的代码,如下所示:
public class MainAct extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TabHost tabHost=getTabHost();
tabHost.addTab(tabHost.newTabSpec("tag1")
.setIndicator("北京")
.setContent(new Intent(this,BeiJingActivity.class)));
说明:
以上代码中红框部分设置BeiJIngActivity作为选项卡的显示内容,效果如图-10所示。
步骤1、Activity类除继承TabActivity类外,还实现TabContentFactory接口,代码如下所示:
public class MainAct extends TabActivity implements TabContentFactory
步骤2、在创建选项卡代码中,将LayoutInflater.from().inflate方法去掉。示例代码如下:
TabHost tabHost=getTabHost();
tabHost.addTab(tabHost.newTabSpec("tab_tag1")
.setIndicator("北京")
.setContent(this));
tabHost.addTab(tabHost.newTabSpec("tab_tag2")
.setIndicator("天津")
.setContent(this));
tabHost.addTab(tabHost.newTabSpec("tab_tag3")
.setIndicator("上海")
.setContent(this));
tabHost.addTab(tabHost.newTabSpec("tab_tag4")
.setIndicator("重庆")
.setContent(this));
说明:
红框中的setContent方法此时与前面介绍的不同,其完整声明如下:
TabSpec setContent(TabContentFactory contentFactory)
该方法的参数是一个实现了TabContentFactory接口的对象。在以上代码中就是当前Activity的对象。因该对象已实现了TabContentFactory接口。
步骤3、实现TabContentFactory接口中定义的方法createTabContent,该方法的完整声明如下:
View createTabContent(String tag);
根据传入的选项卡的Tag值,返回一个Veiw类型的对象,该对象可以是一个控件,也可以是一个包含若干个控件的布局对象。
示例代码:
@Override
public View createTabContent(String tag) {
View layout=null;
if(tag.equals("tab_tag1")){
layout = LayoutInflater.from(
this).inflate(R.layout.beijing, null);
}else if(tag.equals("tab_tag2")){
layout = LayoutInflater.from(
this).inflate(R.layout.tianjin, null);
}else if(tag.equals("tab_tag3")){
layout = LayoutInflater.from(
this).inflate(R.layout.shanghai, null);
}else if(tag.equals("tab_tag4")){
layout = LayoutInflater.from(
this).inflate(R.layout.chongqing, null);
}
return layout;//以View类型返回布局对象
}
Android应用开发中,屏幕的界面大致按上、中、下的结构布局。
1、上:是指屏幕的上边,该部分用来接受用户输入的数据或单击按钮等命令,称为控制部分,通常放置如Spinner、Button、AutocompletetextView等控件。
2、中:显示应用程序的内容部分,通常放置ListView、GridView等控件。
3、下:导航部分,通常放置TabHost、TabWidget、ButtonGroup、RadioGroup等控件。
图-8是58同城网站的手机客户端应用程序
图-9
图-9中标注(1)是手机屏幕的控制部分,该部分有接收用户输入的控件,还有选择城市的Spinner控件。
图-9中标注(2):中间是显示内容的部分。
图-9中标注(3):下边是一个TabHost控件,起导航作用。