android提供了以下四种常用的对话框,分别为
AlertDialog:功能最全,实际应用最为广泛
ProgressDialog:进度对话框
DatePickerDialog:日期选择对话框
TimePickerDialog:时间选择对话框
后三个对话框都是AlertDialog的子类。
1.普通对话框
<span style="font-size:14px;"> //普通对话框
public void c1(View v){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("确认删除"); //设置标题
builder.setMessage("请确认删除吗?"); //设置弹窗消息内容
//设置点击确认所需要做的事情
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "确认删除",Toast.LENGTH_LONG).show();
}
});
//设置点击取消时干的事情
builder.setNegativeButton("取消", null);
builder.show();
}</span>
2.单选对话框
<span style="font-size:14px;"> //单选对话框
public void c2(View v){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final String[] items = {"第一选项","第二选项","第三选项","第四选项"};//内部类访问外部变量必须final,防止变量被更改
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { //参数二表示默认的被选中的是哪一项,0表示第一项
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, items[which]+"被选中("+which+")",Toast.LENGTH_LONG).show();
}
});
//显示多话框
builder.show();
}</span>
调用setSingleChoiceItems()方法时既可以传入数组作为参数,也可以传入Cursor(相当于数据库查询结果集)作为参数,还可以传入ListAdapter作为参数
3.多选对话框
<span style="font-size:14px;"> String[] items = {"第一选项","第二选项","第三选项","第四选项"};
boolean[] checkedItems = {true, true, false, true};//默认哪些项被选中
//多选对话框
public void c3(View v){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Toast.makeText(MainActivity.this, items[which] + "被点击了,状态是:" + isChecked, 0).show();
checkedItems[which] = isChecked;//将选中记录保存在数组中,为下次打开存档
}
});
builder.show();
}</span>
setMultiChoiceItems()方法添加多选列表时,需要传入一个boolean[ ]参数,该参数有两个作用:1.设置初始化时选中哪些列表项 2.该boolean[ ]类型的参数还可用于动态地获取多选列表项中列表项的选中状态。
4.无实时进度对话框
<span style="font-size:14px;"> //无实时进度对话框
public void c4(View v){
final ProgressDialog dialog = ProgressDialog.show(MainActivity.this, null, "正在拼命加载中...");
//在子线程中睡眠三秒钟,不能在主线程中睡眠
new Thread() {
public void run() {
SystemClock.sleep(3000);
dialog.dismiss();//弹窗消失
};
}.start();
}</span>
5.有实施进度对话框
<span style="font-size:14px;"> //有实时进度对话框
final static int MAX_PROGRESS = 100;
private int[] data = new int[50]; //模拟填充长度为50的数组
int progressStatus = 0;
int hasData = 0;
ProgressDialog pd1;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg)
{
//传输一个特定的值,表示是由该程序触发的
if (msg.what == 0x123)
{
pd1.setProgress(progressStatus);
}
}
};
public void c5(View v){
progressStatus = 0;
pd1 = new ProgressDialog(MainActivity.this);
pd1.setTitle("数据正在计算中"); //设置对话夸俺标题
pd1.setMessage("计算完成百分比"); //设置对话框显示的内容
pd1.setMax(MAX_PROGRESS);
pd1.setCancelable(false);//设置对话框不能用“取消”按钮关闭
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置进度条风格
pd1.setIndeterminate(false);//设置进度条是否显示进度
pd1.show();
new Thread(){
public void run(){
while(progressStatus < MAX_PROGRESS) {
progressStatus = MAX_PROGRESS * doWork() / data.length;//获取耗时操作的完成百分比
handler.sendEmptyMessage(0x123); //发送空消息到Handler
}
if (progressStatus >= MAX_PROGRESS){
pd1.dismiss();//计算完成关闭对话框
}
}
}.start();
}
public int doWork(){
data[hasData++] = (int)(Math.random()*100);
try {
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
return hasData;
}</span>
6.自定义View对话框
<span style="font-size:14px;"> //自定义对话框
private static final String tag = "login";
public void c6(View v) {
final TableLayout loginForm = (TableLayout) getLayoutInflater().inflate(R.layout.login, null);//加载login.xml文件,返回对应的TableLayout作为View
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("自定义View对话框");
builder.setView(loginForm); //设置对话框显示的view对象
builder.setPositiveButton("登录", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//点击登陆时执行的动作
Log.i(tag, "您点击了登录按钮");
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i(tag, "取消登录");
}
});
builder.show();
}</span>
7.DatePickerDialog、TimePickerDialog
<span style="font-size:14px;"> Button dateBn = (Button)findViewById(R.id.date);
Button timeBn = (Button)findViewById(R.id.time);
dateBn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View source)
{
Calendar c = Calendar.getInstance();
// 直接创建一个DatePickerDialog对话框实例,并将它显示出来
new DatePickerDialog(MainActivity.this,
// 绑定监听器
new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker dp, int year,
int month, int dayOfMonth)
{
Toast.makeText(MainActivity.this,"您选择了:" + year + "年" + (month + 1) + "月" + dayOfMonth + "日",0).show();
}
}
//设置初始日期
, c.get(Calendar.YEAR)
, c.get(Calendar.MONTH)
, c.get(Calendar.DAY_OF_MONTH)).show();
}
});</span>
<span style="font-size:14px;"> //为“设置时间”按钮绑定监听器
timeBn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View source)
{
Calendar c = Calendar.getInstance();
// 创建一个TimePickerDialog实例,并把它显示出来
new TimePickerDialog(MainActivity.this,
// 绑定监听器
new TimePickerDialog.OnTimeSetListener()
{
@Override
public void onTimeSet(TimePicker tp, int hourOfDay,
int minute)
{
Toast.makeText(MainActivity.this,"您选择了:" + hourOfDay + "时" + minute + "分", 0).show();
}
}
//设置初始时间
, c.get(Calendar.HOUR_OF_DAY)
, c.get(Calendar.MINUTE)
//true表示采用24小时制
, true).show();
}
});</span>