对对话框是Activity运行时显示的小窗口,当显示对话框时,当前Activity失去焦点而由对话框负责所有的人机交互。一般来说,对话框用于提示消息或弹出一个与程序主进程直接相关的小程序。在Android平台下主要支持一下几种对话框:
1.提示对话框AlertDialog
2.进度对话框ProgressDialog
3.日期选择对话框DatePickerDialog
4.时间选择对话框TimePickerDialog
如果需要自定义对话框的外观样式,可以继承Dialog或其子类,并定义自己的布局
对话框是作为Activity的一部分被创建和显示的,在程序中通过开发回调函数onCreateDialog来完成对话框的创建,该方法主要传入对话框的id参数。如果需要显示对话框,则调用showDialog方法传入对话框的id来显示指定的对话框。
当对话框第一次显示时调用onCreateDialog来创建对话框实例,每次对话框显示之前都会调用onPrepareDialog方法,如果不重写该方法,则每回显示的对话框将会是最初创建的那个。
关闭对话框dismiss方法来实现,如果要彻底清除要使用removeDialog方法传入Dialog的id值来彻底释放对话框。
普通对话框实例:
1.strings.xml
<resources>
<string name="app_name">TestActivity</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="btn">显示普通对话框</string>
<string name="title">普通对话框</string>
<string name="ok">确实</string>
<string name="dialog_msg">这是普通对话框中内容</string>
</resources>
2.main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 声明一个线性布局 -->
<EditText
android:text=""
android:id="@+id/EditText01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
android:cursorVisible="false"
/>
<Button
android:text="@string/btn"
android:id="@+id/Button01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
3.Activity
package wyf.jc; //声明包语句
import android.app.Activity; //引入相关类
import android.app.AlertDialog; //引入相关类
import android.app.Dialog; //引入相关类
import android.app.AlertDialog.Builder; //引入相关类
import android.content.DialogInterface; //引入相关类
import android.content.DialogInterface.OnClickListener; //引入相关类
import android.os.Bundle; //引入相关类
import android.view.View; //引入相关类
import android.widget.Button; //引入相关类
import android.widget.EditText; //引入相关类
public class Sample_6_3 extends Activity {
final int COMMON_DIALOG = 1; //普通对话框id
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //设置当前屏幕
Button btn = (Button)findViewById(R.id.Button01); //获得Button对象
btn.setOnClickListener(new View.OnClickListener(){ //为Button设置OnClickListener监听器
@Override
public void onClick(View v) { //重写onClick方法
showDialog(COMMON_DIALOG); //显示普通对话框
}
});
}
@Override
protected Dialog onCreateDialog(int id) { //重写onCreateDialog方法
Dialog dialog = null; //声明一个Dialog对象用于返回
switch(id){ //对id进行判断
case COMMON_DIALOG:
Builder b = new AlertDialog.Builder(this);
b.setIcon(R.drawable.header); //设置对话框的图标
b.setTitle(R.string.btn); //设置对话框的标题
b.setMessage(R.string.dialog_msg); //设置对话框的显示内容
b.setPositiveButton( //添加按钮
R.string.ok,
new OnClickListener() { //为按钮添加监听器
@Override
public void onClick(DialogInterface dialog, int which) {
EditText et = (EditText)findViewById(R.id.EditText01);
et.setText(R.string.dialog_msg);//设置EditText内容
}
});
dialog = b.create(); //生成Dialog对象
break;
default:
break;
}
return dialog; //返回生成Dialog的对象
}
}
程序运行图:
2.列表对话框实例:
1.strings.xml
<resources>
<string name="app_name">TestActivity</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="btn">显示列表对话框</string>
<string name="title">列表对话框</string>
<string-array name="msa">
<item>游泳</item>
<item>打篮球</item>
<item>写Java程序</item>
</string-array>
</resources>
2.main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 声明一个线性布局 -->
<EditText
android:text=""
android:id="@+id/EditText01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
android:cursorVisible="false"
/>
<Button
android:text="@string/btn"
android:id="@+id/Button01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
3.Activity
package wyf.jc; //声明包语句
import android.app.Activity; //引入相关类
import android.app.AlertDialog; //引入相关类
import android.app.Dialog; //引入相关类
import android.app.AlertDialog.Builder; //引入相 关类
import android.content.DialogInterface; //引入相关类
import android.os.Bundle; //引入相关类
import android.view.View; //引入相关类
import android.widget.Button; //引入相关类
import android.widget.EditText; //引入相关类
public class Sample_6_4 extends Activity {
final int LIST_DIALOG = 2; //声明列表对话框的id
@Override
public void onCreate(Bundle savedInstanceState) { //重写onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //设置当前屏幕
Button btn = (Button)findViewById(R.id.Button01);
btn.setOnClickListener(new View.OnClickListener() { //为按钮添加OnClickListener监听器
@Override
public void onClick(View v) {
showDialog(LIST_DIALOG); //显示列表对话框
}
});
}
@Override
protected Dialog onCreateDialog(int id) { //重写的onCreateDialog方法
Dialog dialog = null;
switch(id){ //对id进行判断
case LIST_DIALOG:
Builder b = new AlertDialog.Builder(this); //创建Builder对象
b.setIcon(R.drawable.header); //设置图标
b.setTitle(R.string.title); //设置标题
b.setItems( //设置列表中的各个属性
R.array.msa, //字符串数组
new DialogInterface.OnClickListener() { //为列表设置OnClickListener监听器
@Override
public void onClick(DialogInterface dialog, int which) {
EditText et = (EditText)findViewById(R.id.EditText01);
et.setText("您选择了:"
+getResources().getStringArray(R.array.msa)[which]);
}
});
dialog=b.create(); //生成Dialog对象
break;
default:
break;
}
return dialog; //返回Dialog对象
}
}
程序运行图:
3.单选按钮对话框实例
1.srings.xml
<resources>
<string name="app_name">TestActivity</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="btn">显示单选列表对话框</string>
<string name="title">单选列表对话框</string>
<string name="ok">确定</string>
<string-array name="msa">
<item>游泳</item>
<item>打篮球</item>
<item>写Java程序</item>
</string-array>
</resources>
2.main.xml与上一个实例相同
3.Activity
package com.example.testactivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
final int LIST_DIALOG_SINGLE=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button) findViewById(R.id.Button01);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(LIST_DIALOG_SINGLE);
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub
Dialog dialog=null;
switch (id) {
case LIST_DIALOG_SINGLE:
Builder builder=new AlertDialog.Builder(this);
builder.setIcon(R.drawable.header);
builder.setTitle(R.string.btn);
builder.setSingleChoiceItems(R.array.msa, 0,new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
EditText et=(EditText) findViewById(R.id.EditText01);
et.setText("您选择了:"+getResources().getStringArray(R.array.msa)[which]);
}
});
builder.setPositiveButton(R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
dialog=builder.create();
break;
}
return dialog;
}
}
程序运行图:
4.复选框对话框实例:
1.strings.xml
<resources>
<string name="app_name">TestActivity</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="btn">显示多选列表对话框</string>
<string name="title">多选列表对话框</string>
<string name="ok">确定</string>
<string-array name="msa">
<item>游泳</item>
<item>打篮球</item>
<item>写Java程序</item>
</string-array>
</resources>
2.main.xml与上一个实例相同
3.Activity
package wyf.jc; //声明包语句
import android.app.Activity; //引入相关类
import android.app.AlertDialog; //引入相关类
import android.app.Dialog; //引入相关类
import android.app.AlertDialog.Builder; //引入相关类
import android.content.DialogInterface; //引入相关类
import android.os.Bundle; //引入相关类
import android.view.View; //引入相关类
import android.widget.Button; //引入相关类
import android.widget.EditText; //引入相关类
public class Sample_6_6 extends Activity {
final int LIST_DIALOG_MULTIPLE = 4; //记录多选按钮对话框的id
boolean[] mulFlags=new boolean[]{true,false,true};//初始复选情况
String[] items=null;//选项数组
@Override
public void onCreate(Bundle savedInstanceState) { //重写onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //设置当前屏幕
items=getResources().getStringArray(R.array.msa); //获得XML文件中的字符串数组
Button btn = (Button)findViewById(R.id.Button01);
btn.setOnClickListener(new View.OnClickListener() { //为按钮添加监听器
@Override
public void onClick(View v) {
showDialog(LIST_DIALOG_MULTIPLE); //显示多选按钮对话框
}
});
}
@Override
protected Dialog onCreateDialog(int id) { //重写onCreateDialog方法
Dialog dialog = null;
switch(id){ //对id进行判断
case LIST_DIALOG_MULTIPLE:
Builder b = new AlertDialog.Builder(this); //创建Builder对象
b.setIcon(R.drawable.header); //设置图标
b.setTitle(R.string.title); //设置标题
b.setMultiChoiceItems( //设置多选选项
R.array.msa,
mulFlags, //传入初始的选中状态
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
mulFlags[which] = isChecked; //设置选中标志位
String result = "您选择了:";
for(int i=0;i<mulFlags.length;i++){
if(mulFlags[i]){ //如果该选项被选中
result = result+items[i]+"、";
}
}
EditText et = (EditText)findViewById(R.id.EditText01);
et.setText(result.substring(0,result.length()-1));//设置EditText显示的内容
}
});
b.setPositiveButton( //添加按钮
R.string.ok,
new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {}
});
dialog = b.create(); //生成Dialog方法
break;
default:
break;
}
return dialog; //返回Dialog方法
}
}
程序运行图片:
5.日期以及时间选择对话框
1.strings.xml
<resources>
<string name="app_name">DTPickerDialog</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="date">日期对话框</string>
<string name="time">时间对话框</string>
</resources>
2.main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
android:cursorVisible="false"
/>
<Button
android:id="@+id/Button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/date"/>
<Button
android:id="@+id/Button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/time"/>
<DigitalClock
android:id="@+id/DigitalClock01"
android:textSize="20dip"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<AnalogClock
android:id="@+id/AnalogClock"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</LinearLayout>
3.Activity
package wyf.jc; //声明包语句
import java.util.Calendar; //引入相关类
import android.app.Activity; //引入相关类
import android.app.DatePickerDialog; //引入相关类
import android.app.Dialog; //引入相关类
import android.app.TimePickerDialog; //引入相关类
import android.os.Bundle; //引入相关类
import android.view.View; //引入相关类
import android.view.View.OnClickListener; //引入相关类
import android.widget.Button; //引入相关类
import android.widget.DatePicker; //引入相关类
import android.widget.EditText; //引入相关类
import android.widget.TimePicker; //引入相关类
public class Sample_6_7 extends Activity {
final int DATE_DIALOG=0; //日期选择对话框id
final int TIME_DIALOG=1; //时间选择对话框id
Calendar c=null; //声明一个日历对象
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//打开日期对话框的按钮
Button bDate =(Button) this.findViewById(R.id.Button01);
bDate.setOnClickListener(
new OnClickListener(){
@Override
public void onClick(View v){ //重写onClick方法
showDialog(DATE_DIALOG); //打开单选列表对话框
}
}
);
//打开时间对话框的按钮
Button bTime =(Button) this.findViewById(R.id.Button02);
bTime.setOnClickListener(
new OnClickListener(){
@Override
public void onClick(View v){ //重写onClick方法
showDialog(TIME_DIALOG); //打开单选列表对话框
}
}
);
}
@Override
public Dialog onCreateDialog(int id){ //重写onCreateDialog方法
Dialog dialog=null;
switch(id){ //对id进行判断
case DATE_DIALOG://生成日期对话框的代码
c=Calendar.getInstance();//获取日期对象
dialog=new DatePickerDialog( //创建DatePickerDialog对象
this,
new DatePickerDialog.OnDateSetListener(){ //创建OnDateSetListener监听器
@Override
public void onDateSet(DatePicker dp, int year, int month,int dayOfMonth) {
EditText et = (EditText)findViewById(R.id.et);
et.setText("您选择了:"+year+"年"+month+"月"+dayOfMonth+"日");
}
},
c.get(Calendar.YEAR), //传入年份
c.get(Calendar.MONTH), //传入月份
c.get(Calendar.DAY_OF_MONTH) //传入天数
);
break;
case TIME_DIALOG://生成时间对话框的代码
c=Calendar.getInstance();//获取日期对象
dialog=new TimePickerDialog( //创建TimePickerDialog对象
this,
new TimePickerDialog.OnTimeSetListener(){ //创建OnTimeSetListener监听器
@Override
public void onTimeSet(TimePicker tp, int hourOfDay, int minute) {
EditText et = (EditText)findViewById(R.id.et);
et.setText("您选择了:"+hourOfDay+"时"+minute+"分"); //设置EditText控件的属性
}
},
c.get(Calendar.HOUR_OF_DAY), //传入当前小时数
c.get(Calendar.MINUTE), //传入当前分钟数
false
);
break;
}
return dialog;
}
}
程序运行图:
6.进度条对话框
1.strings.xml
<resources>
<string name="app_name">TestActivity</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="title">安装进度</string>
<string name="ok">确定</string>
</resources>
2.main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 声明一个线性布局 -->
<Button
android:text="@string/ok"
android:id="@+id/Button01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
3.Activity
package wyf.jc; //声明包语句
import android.app.Activity; //引入相关类
import android.app.Dialog; //引入相关类
import android.app.ProgressDialog; //引入相关类
import android.os.Bundle; //引入相关类
import android.os.Handler; //引入相关类
import android.os.Message; //引入相关类
import android.view.View; //引入相关类
import android.view.View.OnClickListener; //引入相关类
import android.widget.Button; //引入相关类
public class Sample_6_8 extends Activity {
final int PROGRESS_DIALOG=0; //声明进度对话框id
final int INCREASE=0; //Handler消息类型
ProgressDialog pd;
Handler myHandler; //Handler对象引用
@Override
public void onCreate(Bundle savedInstanceState) { //重写onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //设置屏幕
Button bok=(Button)this.findViewById(R.id.Button01); //获得Button对象
bok.setOnClickListener( //设置OnClickListener监听器
new OnClickListener(){
@Override
public void onClick(View v) { //重写onClick方法
showDialog(PROGRESS_DIALOG); //显示进度对话框
}
}
);
myHandler=new Handler(){ //创建Handler对象
@Override
public void handleMessage(Message msg){
switch(msg.what){
case INCREASE:
pd.incrementProgressBy(1);//进度每次加1
if(pd.getProgress()>=100){ //判断是否结束进度
pd.dismiss(); //如果进度条走完则关闭窗口
}
break;
}
super.handleMessage(msg);
}
};
}
@Override
public Dialog onCreateDialog(int id){//重写onCreateDialog方法
switch(id){ //对id进行判断
case PROGRESS_DIALOG: //创建进度对话框
pd=new ProgressDialog(this);//创建进度对话框
pd.setMax(100);//设置最大值
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setTitle(R.string.title);//设置标题
pd.setCancelable(false);//设置进度对话框不能用回退按钮关闭
break;
}
return pd;
}
@Override
public void onPrepareDialog(int id, Dialog dialog){//每次弹出对话框时被回调以动态更新对话框内容的方法
super.onPrepareDialog(id, dialog);
switch(id){
case PROGRESS_DIALOG:
pd.incrementProgressBy(-pd.getProgress());//对话框进度清零
new Thread(){ //创建一个线程
public void run(){
while(true){
myHandler.sendEmptyMessage(INCREASE); //发送Handler消息
if(pd.getProgress()>=100){
break;
}
try{
Thread.sleep(40); //线程休眠
}
catch(Exception e){
e.printStackTrace(); //捕获并打印异常
}
}
}
}.start(); //启动线程
break;
}
}
}
程序运行图: