一、ProgressDialog
ProgressDialog代表了进度条对话框,程序只要创建ProgressDialog实例,并将它显示出来就是一个进度条对话框,和它相似的控件有:CharacherPickerDialog、AlertDialog、DatePickerDialog、TimePickerDialog。它的用法有两种:1、直接调用show()方法来显示简单对话框;2、创建ProgressDialog,然后调用方法对对话框里面的进度条进行设置,然后显示出来即可。
常用的方法如下:
- setProgressStyle:设置进度条风格。
- setTitlt:设置标题。
- setMessage:设置提示信息
- setIcon:设置标题图标
- setIndeterminate:设置ProgressDialog 的进度条是否不明确;这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。
- setCancelable:设置ProgressDialog 是否可以按返回键取消。
- CancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。
- setButton:设置ProgressDialog 的一个Button(需要监听Button事件);
- show:显示ProgressDialog。
- cancel:删除progressdialog。
- dismiss:删除progressdialog作用和cancel相同。
- setProgress(intCounter):更新进度条,当然一般都需要Handler的结合来更新进度条。
接下来通过一个例子看一下效果:
- Activity界面中代码MainActivity .java
public class MainActivity extends Activity{
final static int MAX_PROGRESS = 100;
// 该程序模拟填充长度为100的数组
private int[] data = new int[50];
// 记录进度对话框的完成百分比
int progressStatus = 0;
int hasData = 0;
ProgressDialog pd1,pd2;
// 定义一个负责更新的进度的Handler
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
// 表明消息是由该程序发送的
if (msg.what == 0x123){
pd2.setProgress(progressStatus);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void showSpinner(View source){
// 调用静态方法显示环形进度条
ProgressDialog.show(this, "任务执行中"
, "任务执行中,请等待", false, true); // ①
}
public void showIndeterminate(View source){
pd1 = new ProgressDialog(MainActivity.this);
// 设置对话框的标题
pd1.setTitle("任务正在执行中");
// 设置对话框显示的内容
pd1.setMessage("任务正在执行中,敬请等待...");
// 设置对话框能用“取消”按钮关闭
pd1.setCancelable(true);
// 设置对话框的进度条风格
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的进度条是否显示进度
pd1.setIndeterminate(true);
pd1.show(); // ②
}
public void showProgress(View source){
// 将进度条的完成进度重设为0
progressStatus = 0;
// 重新开始填充数组
hasData = 0;
pd2 = new ProgressDialog(MainActivity.this);
pd2.setMax(MAX_PROGRESS);
// 设置对话框的标题
pd2.setTitle("任务完成百分比");
// 设置对话框显示的内容
pd2.setMessage("耗时任务的完成百分比");
// 设置对话框不能用“取消”按钮关闭
pd2.setCancelable(false);
// 设置对话框的进度条风格
pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的进度条是否显示进度
pd2.setIndeterminate(false);
pd2.show(); // ③
new Thread(){
public void run(){
while (progressStatus < MAX_PROGRESS){
// 获取耗时操作的完成百分比
progressStatus = MAX_PROGRESS
* doWork() / data.length;
// 发送空消息到Handler
handler.sendEmptyMessage(0x123);
}
// 如果任务已经完成
if (progressStatus >= MAX_PROGRESS){
// 关闭对话框
pd2.dismiss();
}
}
}.start();
}
// 模拟一个耗时的操作
public int doWork(){
// 为数组元素赋值
data[hasData++] = (int) (Math.random() * 100);
try{
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
return hasData;
}
}
- 相应的布局文件main.xml
显示效果:
二、AlertDialog
我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等方式,重写我们自己的对话框。当然,这也是不失为一个不错的解决方式,但是一般的情况却是这样,我们重写的对话框,也许只在一个特定的地方会用到,为了这一次的使用,而去创建一个新类,往往有点杀鸡用牛刀的感觉,甚至会对我们的程序增加不必要的复杂性,对于这种情形的对话框有没有更优雅的解决方案呢?
答案是:有!,Android提供了这种问题的解决方案,接下来就给大家介绍几种常用的AlertDialog。
(1)AlertDialog一般的创建步骤:
1、创建AlertDialog.Builder对象;
2、调用AlertDialog.Builder的setTitle()或者setCustomTile()方法设置标题;
3、调用AlertDialog.Builder的setIcon方法设置图标;
4、调用AlertDialog.Builder的相关方法设置内容(相关方法见下);
5、调用AlertDialog.Builder的setPositiveButton、setNegativeButton或者setNeutralButton方法添加多个按钮;
6、调用AlertDialog.Builder的create方法创建AlertDialog对象,再调用AlertDialog对象的show显示出来;
(2)AlertDialog指定内容的方法:
- setMessage():设置对方内容为简单文本。
- setItems():设置对话框内容为简单列表项。
- setSingleChoiceItems():设置对话框内容为单选列表项。
- setMultiChoiceItems():设置对话框内容为多选列表项。
- setAdapter():设置对话框内容为自定义列表项。
- setView():设置对话框内容为自定义View。
(3)下面的例子展示了各种各样的Dialog
- MainActivity.java
public class MainActivity extends Activity {
TextView show;
String[] items = new String[]{
"大叨安卓", "UI编程",
"WillFlow",
"AlertDialog"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
show = (TextView) findViewById(R.id.show);
}
public void simple(View source) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("简单对话框")
// 设置图标
.setIcon(R.drawable.tools)
.setMessage("对话框的测试内容\n第二行内容测试");
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
public void simpleList(View source) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("简单列表对话框")
// 设置图标
.setIcon(R.drawable.tools)
// 设置简单的列表项内容
.setItems(items, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
show.setText("你选中了《" + items[which] + "》");
}
});
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
public void singleChoice(View source) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("单选列表项对话框")
// 设置图标
.setIcon(R.drawable.tools)
// 设置单选列表项,默认选中第二项(索引为1)
.setSingleChoiceItems(items, 1, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
show.setText("你选中了《" + items[which] + "》");
}
});
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
public void multiChoice(View source) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("多选列表项对话框")
// 设置图标
.setIcon(R.drawable.tools)
// 设置多选列表项,设置勾选第2项、第4项
.setMultiChoiceItems(items
, new boolean[]{false, true, false, true}, null);
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
public void customList(View source) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("自定义列表项对话框")
// 设置图标
.setIcon(R.drawable.tools)
// 设置自定义列表项
.setAdapter(new ArrayAdapter(this
, R.layout.array_item
, items), null);
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
public void customView(View source) {
// 装载app\src\main\res\layout\login.xml界面布局文件
TableLayout loginForm = (TableLayout) getLayoutInflater()
.inflate(R.layout.login, null);
new AlertDialog.Builder(this)
// 设置对话框的图标
.setIcon(R.drawable.tools)
// 设置对话框的标题
.setTitle("自定义View对话框")
// 设置对话框显示的View对象
.setView(loginForm)
// 为对话框设置一个“确定”按钮
.setPositiveButton("登录", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// 此处可执行登录处理
}
})
// 为对话框设置一个“取消”按钮
.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// 取消登录,不做任何事情
}
})
// 创建并显示对话框
.create()
.show();
}
private AlertDialog.Builder setPositiveButton(
AlertDialog.Builder builder) {
// 调用setPositiveButton方法添加“确定”按钮
return builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
show.setText("单击了【确定】按钮!");
}
});
}
private AlertDialog.Builder setNegativeButton(
AlertDialog.Builder builder) {
// 调用setNegativeButton方法添加“取消”按钮
return builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
show.setText("单击了【取消】按钮!");
}
});
}
}
- 布局文件main.xml
- 自定义界面布局login.xml
-
运行效果
感谢优秀的你跋山涉水看到了这里,不如关注下让我们永远在一起!