常用的UI组件介绍
第3章
本章学习目标
.掌握本章中讲解的Android系统中常用的UI组件。
.掌握对话框的具体使用方法。
.理解ProgresBar及其子类的概念。
实际开发中会经常使用UI组件来组合项目的界面,特殊的组件可以通过第2章中自
定义的UI组件来绘制。通过对本章节的学习,掌握常用UI组件的用法。
3.菜单
1
Android中的菜单(menu)在桌面应用方面十分广泛,几乎所有的桌面应用都会使用到
菜单。但在具体应用中却没有那么多菜单,即便如此,它也是很重要的。Android应用中的
菜单分为3种:选项菜单(OptionMenu)、上下文菜单(ContextMenu)、弹出式菜单
(PopupMenu)。本节依次介绍这些内容。
3.1
选项菜单
1.
从And1开始,d引入了全新的操作栏,扩展了很多功能,例如安置菜单选
项、配置应用图标作为导航按钮等。
可显示在操作栏上的菜单称为选项菜单。选项菜单提供了一些选项,用户选择后可进
行相应的操作。
一般为Android应用添加选项菜单的步骤如下:
roid3.Androi
(1)重写Activity的onCreateOptionsMenu(Menumenu)方法,在该方法里调用Menu
对象的方法添加菜单项。
(2)如果想要引用程序响应菜单项的点击事件,就要继续重写Activity的
onOptionsItemSelected(MenuItemmi)方法。
添加菜单项的方式与UI组件的方式一样,可以在代码中使用,也可以在XML布局文
件中使用。Android同样推荐在XML中使用菜单,具体为在app\src\main\res文件夹中
创建名称为menu的文件夹,创建完成之后在menu文件夹中新建根标签为menu的布局文
件,具体如例3.
1所示。
Android 移动开发与项目实战(微课视频版)
7 2
例3.1 XML文件中的选项菜单options_menu.xml
1
菜单定义完成之后需要在代码中使用才可以看到效果,Java代码如下所示。
1 public class MainActivity extends AppCompatActivity {
2 @Override
3 protected void onCreate(Bundle savedInstanceState) {
4 super.onCreate(savedInstanceState);
5 setContentView(R.layout.activity_main);
6 }
7 @Override
8 public boolean onCreateOptionsMenu(Menu menu) {
9 getMenuInflater().inflate(R.menu.option_menu, menu);
10 return true;
11 }
12 @Override
13 public boolean onOptionsItemSelected(MenuItem item) {
14 switch (item.getItemId()) {
15 case R.id.menu_item1:
16 Toast.makeText(MainActivity.this,
17 "第一个菜单项", Toast.LENGTH_LONG).show();
18 break;
19 case R.id.menu_item2:
20 Toast.makeText(MainActivity.this,
21 "第二个菜单项", Toast.LENGTH_LONG).show();
22 break;
23 case R.id.menu_item3:
24 Toast.makeText(MainActivity.this,
25 "第三个菜单项", Toast.LENGTH_LONG).show();
26 break;
27 }
28 return true;
29 }
30 }
上述程序中第8行和第13行代码是显示菜单和响应菜单点击事件的两个方法。这样
7 3
第3章
常用的UI组件介绍
图3.1 选项菜单运行结果
就实现了简单的选项菜单,程序运行结果如图3.1所示。
一个简单的选项菜单示例就完成了。下面来分析
Menu的组成结构。
Menu接口是一个父接口,该接口下实现了两个子接口。
. SubMenu:代表一个子菜单,可包含1~N 个
MenuItem(形成菜单项)。
. ContextMenu:代表一个上下文菜单,可包含1~
N 个MenuItem。
Menu 接口定义了add()方法用于添加菜单项,
addSubMenu()方法用于添加子菜单项。有好几个重载方
法可供选择,使用时可根据需求选择。SubMenu继承自
Menu,它额外提供了setHeaderIcon()、setHeaderTitle()
和setHeaderView()方法,分别用于设置菜单头的图标、标题以及菜单头。
这些方法的使用暂不举例讲解,希望读者自行练习。
3.1.2 上下文菜单
3.1.1节讲到,ContextMenu继承自Menu,开发上下文菜单与开发选项菜单基本类似,
区别在于:开发上下文菜单是重写onCreateContextMenu(ContextMenu menu,View
source,ContextMenu.ContextMenuInfomenuInfo)方法,其中source参数代表触发上下文
菜单的组件。
开发上下文菜单的步骤如下:
(1)重写Activity的onCreateContextMenu()方法。
(2)调用Activity的registerForContextMenu(Viewview)方法为view 注册上下文
菜单。
(3)如果想实现点击事件,需要重写onContextItemSelected(MenuItem mi)方法。
与3.1.1 节提到的SubMenu 相似,ContextMenu 也提供了setHeaderIcon()与
setHeaderTitle()方法为ContextMenu设置图标和标题。
接下来实现一个简单的ContextMenu示例,该示例的功能是长按文字,然后出现可供
改变文字背景色的上下文菜单,如例3.2所示。
例3.2 XML文件中的上下文菜单context_menu.xml
1
Android 移动开发与项目实战(微课视频版)
7 4
在Java代码MainActivity.java中添加上下文菜单。
1 package com.example.chapater3_2;
2 import androidx.appcompat.app.AppCompatActivity;
3 import android.graphics.Color;
4 import android.os.Bundle;
5 import android.view.ContextMenu;
6 import android.view.MenuItem;
7 import android.view.View;
8 import android.widget.TextView;
9 10 public class MainActivity extends AppCompatActivity {
11 private TextView textView;
12 @Override
13 protected void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.activity_main);
16 textView = (TextView) findViewById(R.id.my_text);
17 registerForContextMenu(textView);
18 }
19
20 @Override
21 public void onCreateContextMenu(ContextMenu menu, View v,
22 ContextMenu.ContextMenuInfo menuInfo) {
23 getMenuInflater().inflate(R.menu.context_menu, menu);
24 menu.setGroupCheckable(0, true, true);
25 menu.setHeaderTitle("选择背景颜色");
26 }
27
28 @Override
29 public boolean onContextItemSelected(MenuItem item) {
30 switch (item.getItemId()) {
31 case R.id.red:
32 item.setChecked(true);
33 textView.setBackgroundColor(Color.RED);
34 break;
35 case R.id.black:
36 item.setChecked(true);
37 textView.setBackgroundColor(Color.BLACK);
38 break;
39 case R.id.blue:
40 item.setChecked(true);
41 textView.setBackgroundColor(Color.BLUE);
42 break;
43 }
7 5
第3章
常用的UI组件介绍
44 return true;
45 }
46
47 @Override
48 protected void onDestroy() {
49 super.onDestroy();
50 unregisterForContextMenu(textView);
51 }
52 }
上述Java代码中重写了onCreateContextMenu()与onContextItemSelected()方法,分
图3.2 上下文菜单运行结果
别用于实现加载上下文菜单、菜单的点击事件,代码中两处
的粗体部分,分别是注册和解绑上下文菜单,可能读者会疑
惑为什么要在onDestroy()中解绑,在后文讲解Activity时
一并讲解。程序运行结果如图3.2所示。
上下文菜单需长按注册的组件才能出现,这一点和选
项菜单不同。希望读者认真练习例3.2中的代码。
3.1.3 弹出式菜单
默认情况下,PopupMenu会在指定组件的上方或下方
弹出。PopupMenu可增加多个菜单项,并可为菜单项增加
子菜单。
使用PopupMenu的步骤与前两种Menu不同,步骤
如下:
(1)调用new PopupMenu(Contextcontext,View
anchor)创建下拉菜单,anchor代表要激发弹出菜单的
组件。
(2)调用MenuInflater的inflate()方法将菜单资源填
充到PopupMenu中。
(3)调用PopupMenu的show()方法显示弹出式菜单。
接下来,通过例3.3所示学习弹出式菜单。
例3.3 XML文件中的弹出式菜单popup_menu.xml
1 xml version="1.0" encoding="utf-8"? >
2
界面布局文件中只有一个Button,在Button标签下直接设置点击事件popupMenuClick,
代码如下所示。
1 xml version="1.0" encoding="utf-8"? >
2
67
14
Java代码如下所示。
1 package com.example.chapater3_3;
2 import androidx.appcompat.app.AppCompatActivity;
3 import android.os.Bundle;
4 import android.view.MenuItem;
5 import android.view.View;
6 import android.widget.PopupMenu;
7 import android.widget.Toast;
89
public class MainActivity extends AppCompatActivity {
10 private PopupMenu popupMenu;
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_main);
15 }
16
7 7
第3章
常用的UI组件介绍
17 public void popupMenuClick(View view) {
18 popupMenu = new PopupMenu(this, view);
19 getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());
20 popupMenu.setOnMenuItemClickListener(
21 new PopupMenu.OnMenuItemClickListener() {
22 @Override
23 public boolean onMenuItemClick(MenuItem item) {
24 switch (item.getItemId()) {
25 case R.id.hide:
26 popupMenu.dismiss();
27 break;
28 default:
29 Toast.makeText(MainActivity.this, "点击了" +
item.getTitle(), Toast.LENGTH_LONG).show();
30 }
31 return true;
32 }
33 });
34 popupMenu.show();
35 }
36 }
上述程序中创建了一个PopupMenu对象,通过inflate将popup_menu菜单资源填充
图3.3 弹出式菜单运行结果
入PopupMenu中,可实现当用户点击界面组件时弹出
PopupMenu。
运行程序,点击界面中的Button控件,可看到如图3.3
所示的界面。
前两种菜单的创建非常相似,只有弹出式菜单创建比
较特殊。在实际开发中这3种菜单会经常使用,希望读者
能动手练习并掌握其用法。讲解完使用方式之后,下面再
来看一个小知识点:在菜单项中启动另外一个Activity(或
Service)。
3.1.4 设置与菜单项关联的Activity
在实际开发中会经常碰到这样一种情况:点击某个菜
单项后,跳转到另外一个Activity(或者Service)。对于这
种需求,Menu中也有直接的方法可以使用。用户只需要调
用MenuItem 的setIntent(Intentintent)方法就可以把该菜
单项与指定的Intent关联到一起,当用户点击该菜单项时,
该Intent所包含的组件就会被启动。
Android 移动开发与项目实战(微课视频版)
7 8
接下来,将示范调用该方法启动一个Activity的例子,如例3.4所示。由于该程序几乎
不包含任何界面组件,因此不展示界面布局文件。
例3.4 使用Menu自带的setIntent()方法启动Activity
1 ppackage com.example.chapater3_4;
2 import androidx.appcompat.app.AppCompatActivity;
3 import android.content.Intent;
4 import android.os.Bundle;
5 import android.view.Menu;
6 import android.view.MenuItem;
7
8 public class MainActivity extends AppCompatActivity {
9 @Override
10 protected void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12 setContentView(R.layout.activity_main);
13 }
14
15 @Override
16 public boolean onCreateOptionsMenu(Menu menu) {
17 getMenuInflater().inflate(R.menu.option_menu, menu);
18 return super.onCreateOptionsMenu(menu);
19 }
20
21 @Override
22 public boolean onOptionsItemSelected(MenuItem item) {
23 switch (item.getItemId()) {
24 case R.id.menu_item1:
25 item.setIntent(new Intent(MainActivity.this,
HelloWorldActivity.class));
26 break;
27 }
28 return super.onOptionsItemSelected(item);
29 }
30 }
上述程序中的第25 行代码就是启动HelloWorldActivity,需要注意的是
HelloWorldActivity是一个新的Activity 文件,代表一个用户交互界面。在创建了
HelloWorldActivity文件后,要在项目的核心清单配置文件AndroidManifest.xml中注册
HelloWorldActivity。程序运行结果如图3.4所示。
图3.ctivity界面
4 利用菜单选项启动A
3.对话框的使用
2
在日常的App使用中经常看到对话框,可以说对话框的出现使得App不再那么单调。
d中提供了丰富的对话框支持,日常开发中会经常使用以下4种对话框,如表3.
Androi1
所示。
表3.
14种对话框
对话框
AlertDialog
ProgresDialog
DatePickerDialog
TimePlckerDialog
说明
功能最丰富,实际应用最广的对话框
进度对话框,只用来显示进度条
日期选择对话框,只用来选择日期
时间选择对话框,只用来选择时间
3.2.1
使用AlertDialog建立对话框
AlertDialog是上述4种对话框中功能最强大、用法最灵活的一种,同时它也是其他3
种对话框的父类。
使用AlertDialog生成的对话框样式多变,但是基本样式总包含4个区域:图标区、标
题区、内容区和按钮区。
创建一个AlertDialog一般需要如下几个步骤:
(1)创建AleraoBidr对象。
tDilg.ule
79
第
章
常用的UI组件介绍
Android 移动开发与项目实战(微课视频版)
8 0
(2)调用AlertDialog.Builder的setTitle()或setCustomTitle()方法设置标题。
(3)调用AlertDialog.Builder的setIcon()方法设置图标。
(4)调用AlertDialog.Builder的相关设置方法设置对话框内容。
(5) 调用AlertDialog.Builder 的setPositiveButton()、setNegativeButton()或
setNeutralButton()方法添加多个按钮。
(6) 调用AlertDialog.Builder 的create()方法创建AlertDialog 对象,再调用
AlertDialog对象的show()方法将该对话框显示出来。
AlertDialog的样式多变,就是因为设置对话框内容时的样式多变,AlertDialog提供了
6种方法设置对话框的内容,如表3.2所示。
表3.2 AlertDialog中的方法
方 法说 明
setMessage() 设置对话框内容为简单文本
setItems() 设置对话框内容为简单列表项
setSingleChoiceItems() 设置对话框内容为单选列表项
setMultiChoiceItems() 设置对话框内容为多选列表项
setAdapter() 设置对话框内容为自定义列表项
setView() 设置对话框内容为自定义View
接下来,通过以下示例来深入理解AlertDialog中的方法,具体如例3.5~例3.9所示。
例3.5 简单对话框示例
1 public void simpleAlertDialog(View view) {
2 AlertDialog.Builder builder = new AlertDialog.Builder(this)
3 .setTitle("简单对话框")
4 .setIcon(R.drawable.icon_dialog)
5 .setMessage("第一行内容\n 第二行内容");
6 setPositiveButton(builder);
7 setNegativeButton(builder)
8 .create()
9 .show();
10 }
上述程序是在布局文件中设置Button的点击事件为simpleAlertDialog,具体代码如下
所示。
1 xml version="1.0" encoding="utf-8"? >
2
89
19
20
Java代码中的setPositiveButton(builder)和setNegativeButton(builder)方法被抽出来
作为单独的方法使用,由于AlertDialog的例子较多,把相同的代码抽出来作为工具使用很
方便,这也是开发中经常用到的开发方式。这两个方法的具体代码如下所示。
1 private AlertDialog.Builder setPositiveButton(
2 AlertDialog.Builder builder) {
34
return builder.setPositiveButton("确定",
5 new DialogInterface.OnClickListener() {
6 @Override
7 public void onClick(DialogInterface dialog, int which) {
8 mBtnAlert.setText("点击了“确定”按钮");
9 }
10 });
11 }
12
13 private AlertDialog.Builder setNegativeButton(
14 AlertDialog.Builder builder) {
15 return builder.setNegativeButton("取消",
16 new DialogInterface.OnClickListener() {
17 @Override
18 public void onClick(DialogInterface dialog, int which) {
19 mBtnAlert.setText("点击了“取消”按钮");
20 }
21 });
22 }
在第一部分的第2~5行代码中,设置了对话框的标题、图标以及内容,运行程序,将看
Android 移动开发与项目实战(微课视频版)
8 2
到如图3.5所示的界面。
图3.5 简单对话框
例3.6 简单列表项对话框示例
1 public void simpleListAlertDialog(View view) {
2 AlertDialog.Builder builder = new AlertDialog.Builder(this)
3 .setTitle("简单列表项对话框")
4 .setIcon(R.drawable.warning)
5 .setItems(items, new DialogInterface.OnClickListener() {
6 @Override
7 public void onClick(DialogInterface dialog, int which) {
8 mBtnAlert.setText("您选中了《" + items[which] + "》");
9 }
10 });
11 setPositiveButton(builder);
12 setNegativeButton(builder)
13 .create()
14 .show();
15 }
与简单对话框一样,布局文件中同样使用了Button的点击事件simpleListAlertDialog,这
里就不显示具体的布局代码了,之后的几个AlertDialog例子与此相同。如上述代码所示,调
用了AlertDialog.Builder中的setItems()方法为对话框设置了多个列表项,首先定义了数组
items,这里具体的items数组如下所示。
1 Private String[] items = new String[]{"Java 语言程序设计",
2 "Android 基础", "Android 开发艺术探索", "FrameWork 学习"};
8 3
第3章
常用的UI组件介绍
运行例3.6的程序,将看到如图3.6所示的界面。
例3.7 单选列表项对话框示例
1 public void singleChoiceDialog(View view) {
2 AlertDialog.Builder builder = new AlertDialog.Builder(this)
3 .setTitle("单选列表项对话框")
4 .setIcon(R.drawable.warning)
5 //设置单选列表项,默认选中第一项(索引为0)
6 .setSingleChoiceItems(items, 0,
7 new DialogInterface.OnClickListener() {
8 @Override
9 public void onClick(DialogInterface dialog, int
which) {
10 mBtnAlert.setText("您选中了《" + items[which]
+ "》");
11 }
12 });
13 setPositiveButton(builder);
14 setNegativeButton(builder)
15 .create()
16 .show();
17 }
如上述代码所示,只要调用了AlertDialog.Builder的setSingleChoiceItems()方法就可
创建带单选列表项的对话框,运行程序,将看到如图3.7所示的界面。
图3.6 简单列表项对话框
图3.7 单选列表项对话框
Android 移动开发与项目实战(微课视频版)
8 4
例3.8 多选列表项对话框示例
1 public void multiChoiceDialog(View view) {
2 AlertDialog.Builder builder = new AlertDialog.Builder(this)
3 .setTitle("多选列表项对话框")
4 .setIcon(R.drawable.icon_dialog)
5 .setMultiChoiceItems(items,
6 new boolean[]{true, false, false, false}, null);
7 setPositiveButton(builder);
8 setNegativeButton(builder)
9 .create()
10 .show();
11 }
调用AlertDialog.Builder的setMultiChoiceItems()方法添加多选列表项时,需要传入
一个boolean数组的参数,这个参数既可以在初始化时设置哪些选项可被选中,也可以动态
获取列表项的选中状态。运行上面的程序,将看到如图3.8所示的界面。
图3.8 多选列表项对话框
例3.9 自定义View对话框
1 xml version="1.0" encoding="utf-8"? >
2
6
8 5
第3章
常用的UI组件介绍
7
11
12
19
20
26
27
28
32
33
40
41
47
48
49
53
54
61
62
68
69
这里在layout文件夹下新建了名为register_form.xml的表单布局文件,具体内容为账
号、密码以及确认密码等常规注册项,接下来在应用程序中调用AlertDialog.Builder的
setView()方法让对话框显示该注册界面,关键代码如下所示。
1 public void customListDialog(View view) {
2 TableLayout registerForm = (TableLayout) getLayoutInflater().
3 inflate(R.layout.register_form, null);
4 new AlertDialog.Builder(this)
5 .setTitle("自定义对话框")
6 .setIcon(R.drawable.icon_dialog)
7 .setView(registerForm)
8 .setPositiveButton("注册",
9 new DialogInterface.OnClickListener() {
10 @Override
11 public void onClick(DialogInterface dialog, int which) {
12 //开始注册的逻辑编写
13 }
14 }).setNegativeButton("取消",
15 new DialogInterface.OnClickListener() {
16 @Override
17 public void onClick(DialogInterface dialog, int which) {
18 //取消注册
19 }
20 })
8 7
第3章
常用的UI组件介绍
21 .create()
22 .show();
23 }
注意看上述代码中的粗体字代码部分,第3行是显式加载了layout文件夹中的register_
form.xml文件,并返回该文件对应的TableLayout作为View。第7行调用AlertDialog.Builder
的setView()方法显示TableLayout。运行上面的程序,可以看到如图3.9所示的界面。
图3.9 自定义View对话框
3.2.2 创建DatePickerDialog和TimePickerDialog对话框
DatePickerDialog和TimePickerDialog的功能较为简单,用法也简单,使用步骤如下:
(1)通过new关键字创建DatePickerDialog和TimePickerDialog对话框,然后调用它
们自带的show()方法即可将这两种对话框显示出来。
(2)为DatePickerDialog和TimePickerDialog绑定监听器,这样可以保证用户通过
DatePickerDialog和TimePickerDialog设置事件时触发监听器,从而通过监听器来获取用
户设置的事件。
例3.10 DatePickerDialog对话框示例
1 public void dateDialog(View view) {
2 //创建Calendar 实例
3 Calendar calendar = Calendar.getInstance();
4 //直接创建DatePickerDialog 实例并显示
5 new DatePickerDialog(this,
6 new DatePickerDialog.OnDateSetListener() {
Android 移动开发与项目实战(微课视频版)
8 8
7 @Override
8 public void onDateSet(DatePicker view,
9 int year, int month, int dayOfMonth) {
10 TextView show = (TextView) findViewById(R.id.showDate);
11 show.setText("日期选择:" + year +"-"
12 + (month + 1)+ "-" + dayOfMonth);
13 }
14 }, calendar.get(Calendar.YEAR),
15 calendar.get(Calendar.MONTH),
16 calendar.get(Calendar.DAY_OF_MONTH)).show();
17 }
上述中粗体字代码直接创建了DatePickerDialog对话框。运行程序,将显示日期选择
对话框,如图3.10所示。
图3.10 DatePickerDialog对话框及选择的日期
3.2.3 创建ProgressDialog对话框
程序中只要创建了ProgressDialog 实例并且调用show()方法将其显示出来,
ProgressDialog对话框就已经创建完成。在实际开发中,会经常对ProgressDialog对话框
中的进度条进行设置,设置的方法如表3.3所示。
表3.3 ProgressDialog中的方法
方 法说 明
setIndeterminater(Booleanindeterminater) 设置进度条不显示进度值
setMax(intmax) 设置进度条的最大值
续表
8 9
第3章
常用的UI组件介绍
方 法说 明
setMessage(CharSequencemesssge) 设置进度框里显示的消息
setProgress(intvalue) 设置进度条的进度值
setProgressStyle(intstyle) 设置进度条的风格
接下来看ProgressDialog示例,该程序中的界面部分和之前的一样,都是使用Button
组件,并且在Button中设置点击事件。所以这里不给出界面部分的代码,直接看Java代
码。具体如例3.11所示。
例3.11 ProgressDialog对话框示例
1 package com.example.chapater3_11;
2 import androidx.appcompat.app.AppCompatActivity;
3 import android.app.ProgressDialog;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.os.Message;
7 import android.view.View;
8 import java.lang.ref.WeakReference;
9 import java.util.Timer;
10 import java.util.TimerTask;
11 public class MainActivity extends AppCompatActivity {
12 //设置progress 的最大值
13 final static int MAX_VALUE = 100;
14 ProgressDialog progressDialog;
15 public MyHandler myHandler;
16 int status = 0;
17 //创建自定义Handler,这种写法可避免内存泄漏
18 public class MyHandler extends Handler {
19 private WeakReference myActivity;
20 public MyHandler(MainActivity activity){
21 this.myActivity = new WeakReference<>(activity);
22 }
23
24 @Override
25 public void handleMessage(Message msg) {
26 MainActivity activity = myActivity.get();
27 if (activity != null) {
28 switch (msg.what) {
29 case 0:
30 //设置进度
31 progressDialog.setProgress(status);
32 break;
Android 移动开发与项目实战(微课视频版)
9 0
33 case 1:
34 //执行完毕之后隐藏ProgressDialog
35 progressDialog.dismiss();
36 break;
37 }
38 }
39 super.handleMessage(msg);
40 }
41 }
42 @Override
43 protected void onCreate(Bundle savedInstanceState) {
44 super.onCreate(savedInstanceState);
45 setContentView(R.layout.activity_main);
46 myHandler = new MyHandler(this);
47 }
48 //设置的Button 点击事件
49 public void showProgress(View view) {
50 status = 0;
51 progressDialog = new ProgressDialog(MainActivity.this);
52 //对ProgressDialog 进行常规设置
53 progressDialog.setMax(MAX_VALUE);
54 progressDialog.setTitle("进度对话框");
55 progressDialog.setMessage("已完成进度");
56 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
57 progressDialog.setIndeterminate(false);
58 progressDialog.show();
59 //从第一秒开始,每秒执行一次
60 timer.schedule(task, 1000, 1000);
61 }
62 //使用Timer 与TimerTask 制造一个定时器,到固定时间向Handler 发送消息
63 Timer timer = new Timer();
64 TimerTask task = new TimerTask() {
65 @Override
66 public void run() {
67 //每次调用TimerTask,status 就加1
68 status++;
69 //任务执行中以及执行完成之后分别向Handler 发送消息
70 if (status < MAX_VALUE) {
71 myHandler.sendEmptyMessage(0);
72 } else {
73 myHandler.sendEmptyMessage(1);
74 }
75 }
76 };
77 }