Dialog是Android常用的对话框控件。AlertDialog对话框是Dialog的子类,它提供一个图标,一个标题,一个文本和3个按钮。以前用过的DatePickerDialog和TimePickerDialog是Dialog的间接子类。ProgressDialog是AlertDialog类的一个扩展,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。
一、AlertDialog使用方法
1.创建对话框
setIcon:创建图标;setTitle:设置标题;setMessage:设置内容;setPositiveButton:响应Yes/Ok的点击,setNeutralButton:响应中立行为的点击,setNegativeButton:响应No/Cancel的点击。都需要传进去一个OnClickListener的对象。
dialog = new AlertDialog.Builder(this)
.setIcon(android.R.drawable.btn_star).setTitle("这是一个警告对话框")
.setMessage("确定要退出吗?")
.setPositiveButton("是", dbl)
.setNegativeButton("否", dbl)
.setNeutralButton("取消", dbl).create();
2.准备显示对话框,这是一个可选的回调函数。 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而onCreateDialog(int) 仅在对话框第一次打开时被调用。如果你不定义onPrepareDialog(),那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的ID,和在onCreateDialog()中创建的对话框对象。即对话框对象每次运行之后创建一次,不会每次调用都创建,所以只能在onPrepareDialog中更改。
// 每次显示对话框之前会被调用
@Override
public void onPrepareDialog(int id, Dialog dialog){
Toast.makeText(this, "onPrepareDialog方法被调用",
Toast.LENGTH_LONG).show();
super.onPrepareDialog(id, dialog);
}
3. 添加对话框中按钮点击事件的监听器,点击取消按钮Dialog.BUTTON_NEUTRAL不会调用OnCancelListener
// 对话框按钮点击事件监听器
class DialogButtonListener implements DialogInterface.OnClickListener{
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case Dialog.BUTTON_NEGATIVE:
Toast.makeText(AlertDialogActivity.this, "不退出",
Toast.LENGTH_LONG).show();
break;
case Dialog.BUTTON_NEUTRAL:
Toast.makeText(AlertDialogActivity.this, "取消",
Toast.LENGTH_LONG).show();
break;
case Dialog.BUTTON_POSITIVE:
Toast.makeText(AlertDialogActivity.this, "退出",
Toast.LENGTH_LONG).show();
break;
}
}
}
4.显示对话框
showDialog(DIALOG_ID);
同样也可以消除对话框和移除对话框,移除对话框会同时调用注册的OnCancelListener,即删除对话框对象,而消除对话框则不会删除dialog对象,下次调用的时候还是这个对象:
//消除对话框
dismissDialog(DIALOG_ID);
//移除对话框
removeDialog(DIALOG_ID);
完整代码:
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" > <Button android:id="@+id/showdialog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="弹出对话框" /> <Button android:id="@+id/deletedialog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="关闭对话框" /> <Button android:id="@+id/removedialog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="移除对话框" /> </LinearLayout>
AlertDialogActivity.java
package com.android.activity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class AlertDialogActivity extends Activity {
private Button showDialog = null;
private Button deleteDialog = null;
private Button removeDialog = null;
private Dialog dialog = null;
DialogButtonListener dbl = null;
private static final int DIALOG_ID = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
showDialog = (Button)findViewById(R.id.showdialog);
deleteDialog = (Button)findViewById(R.id.deletedialog);
removeDialog = (Button)findViewById(R.id.removedialog);
dbl = new DialogButtonListener();
showDialog.setOnClickListener(new ShowButtonListener());
deleteDialog.setOnClickListener(new DeleteButtonListener());
removeDialog.setOnClickListener(new RemoveButtonListener());
}
// 创建会话框时调用
@Override
public Dialog onCreateDialog(int id) {
Toast.makeText(this, "onCreateDialog方法被调用",
Toast.LENGTH_LONG).show();
dialog = new AlertDialog.Builder(this)
.setIcon(android.R.drawable.btn_star)
.setTitle("这是一个警告对话框!")
.setMessage("确定要退出吗?")
.setPositiveButton("是", dbl)
.setNegativeButton("否", dbl)
.setNeutralButton("取消", dbl).create();
return dialog;
}
// 每次显示对话框之前会被调用
@Override
public void onPrepareDialog(int id, Dialog dialog){
Toast.makeText(this, "onPrepareDialog方法被调用",
Toast.LENGTH_LONG).show();
super.onPrepareDialog(id, dialog);
}
// 对话框按钮点击事件监听器
class DialogButtonListener implements DialogInterface.OnClickListener{
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case Dialog.BUTTON_NEGATIVE:
Toast.makeText(AlertDialogActivity.this,
"不退出",Toast.LENGTH_LONG).show();
break;
case Dialog.BUTTON_NEUTRAL:
Toast.makeText(AlertDialogActivity.this,
"取消",Toast.LENGTH_LONG).show();
break;
case Dialog.BUTTON_POSITIVE:
Toast.makeText(AlertDialogActivity.this,
"退出",Toast.LENGTH_LONG).show();
break;
}
}
}
//弹出对话框按钮监听器
class ShowButtonListener implements OnClickListener{
public void onClick(View v) {
//显示对话框
showDialog(DIALOG_ID);
}
}
//关闭对话框按钮监听器
class DeleteButtonListener implements OnClickListener{
public void onClick(View v) {
//关闭对话框
dismissDialog(DIALOG_ID);
}
}
//移除对话框按钮监听器
class RemoveButtonListener implements OnClickListener{
public void onClick(View v) {
//移除对话框 ,会同时调用注册的OnCancelListener()
removeDialog(DIALOG_ID);
}
}
}
运行结果:
二、ProgressDialog使用方法
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" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:text="圆形进度对话框" android:id="@+id/spinnerprogress" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:text="长方形进度对话框" android:id="@+id/horizonalprogress" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
ProgressDialogActivity.java
package com.android.activity;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ProgressDialogActivity extends Activity {
private Button spinnerProgress = null;
private Button horizonalProgress = null;
private ProgressDialog progressDialog = null;
private ProgressDialog progressDialog2 = null;
int count = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
spinnerProgress = (Button)findViewById(R.id.spinnerprogress);
horizonalProgress =
(Button)findViewById(R.id.horizonalprogress);
spinnerProgress.setOnClickListener(new SpinnerProgress());
horizonalProgress.setOnClickListener(new HorizonalProgress());
}
class SpinnerProgress implements OnClickListener{
public void onClick(View view) {
//创建ProgressDialog对象
progressDialog = new ProgressDialog(
ProgressDialogActivity.this);
//设置进度条风格,风格为圆形,旋转的
progressDialog.setProgressStyle(
ProgressDialog.STYLE_SPINNER);
//设置ProgressDialog 标题
progressDialog.setTitle("下载");
//设置ProgressDialog 提示信息
progressDialog.setMessage("这是一个圆形进度条对话框");
//设置ProgressDialog 标题图标
progressDialog.setIcon(android.R.drawable.btn_star);
//设置ProgressDialog 的进度条是否不明确
progressDialog.setIndeterminate(false);
//设置ProgressDialog 是否可以按退回按键取消
progressDialog.setCancelable(true);
//设置取消按钮
progressDialog.setButton("取消",
new ProgressDialogButtonListener());
// 让ProgressDialog显示
progressDialog.show();
}
}
class ProgressDialogButtonListener
implements DialogInterface.OnClickListener{
public void onClick(DialogInterface dialog, int which) {
//点击"取消按钮"取消对话框
dialog.cancel();
}
}
class HorizonalProgress implements OnClickListener{
public void onClick(View view) {
progressDialog2 = new ProgressDialog(
ProgressDialogActivity.this);
//设置进度条风格,风格长方形的
progressDialog2.setProgressStyle(
ProgressDialog.STYLE_HORIZONTAL);
progressDialog2.setTitle("下载");
progressDialog2.setMessage("这是一个长方形进度条对话框");
progressDialog2.setIcon(android.R.drawable.btn_star);
progressDialog2.setIndeterminate(false);
progressDialog2.setCancelable(true);
progressDialog2.setButton("取消",
new ProgressDialogButtonListener());
progressDialog2.show();
Thread t = new Thread(new ProgressThread());
t.start();
}
}
class ProgressThread implements Runnable{
public void run() {
try{
while (count <= 100){
// 由线程来控制进度。
progressDialog2.setProgress(count++);
Thread.sleep(100);
}
progressDialog2.setMessage("下载完成");
}catch (InterruptedException e){
progressDialog2.cancel();
}
}
}
}
运行结果: