在Android开发中,很多情况下我们需要显示一个对话框或浮动窗体来完成一些简单的任务,比如需要让用户输入一些内容,或让用户确认一些信息。Android提供了丰富的对话框支持,常用的四种对话框如下:

  • 警告对话框 AlertDialog: 一个可以有0到3个按钮, 一个单选框或复选框的列表的对话框. 警告对话框可以创建大多数的交互界面, 是推荐的类型.
  • 进度对话框 ProgressDialog: 显示一个进度环或者一个进度条. 由于它是AlertDialog的扩展, 所以它也支持按钮.
  • 日期选择对话框 DatePickerDialog: 让用户选择一个日期.
  • 时间选择对话框 TimePickerDialog: 让用户选择一个时间. 当然我们也可以扩展Dialog类来自定义对话框。在Android中,我们可以通过两种方式来创建对话框:
  1. 借助Dialog类,或它的子类(如AlertDialog,ProgressDialog等)
  2. 使用Activity的对话框主题 AlertDialog对话框是Dialog的子类,它提供一个图标,一个标题,一个文本和0-3个按钮。我们在Activity里可以自行创建和显示Dialog,也可以通过Activity的方法对其进行管理。Android中的alertDialog的创建一般是通过其内嵌类AlertDialog.Builder来实现的。所以首先浏览一下这个builder所提供的方法:

setTitle():给对话框设置title. setIcon():给对话框设置图标。 setMessage():设置对话框的提示信息 setItems():设置对话框要显示的一个list,一般用于要显示几个命令时 setSingleChoiceItems():设置对话框显示一个单选的List setMultiChoiceItems():用来设置对话框显示一系列的复选框。 setPositiveButton():给对话框添加”Yes”按钮。 setNegativeButton():给对话框添加”No”按钮。

下面我们来看一个最简单的通话框,当我们点击菜单后,将出现登录和退出菜单:

DailogDemo
DailogDemo

 

如果我们点击退出则弹出退出确认:

DailogDemo
DailogDemo

 

如果我们点击登录,则弹出登录对话框:

DailogDemo
DailogDemo

 

点击登录后验证用户名和密码,如果用户名和密码为空,则又弹出警告框。

DailogDemo
DailogDemo

 

如果用户名和密码不同空,则显示一个ProgressDialog

DailogDemo
DailogDemo

程序代码如下:

package com.liuzhichao.dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

public class DialogDemoActivity extends Activity {

	//定义菜单退出和登录常量
	private static final int MENU_EXIT=1;  
	private static final int MENU_LOGIN=2;

	//定义一个ProgressDialog
	private ProgressDialog mProgressDialog;

	//定义上下文
	private Context context;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		context = DialogDemoActivity.this;
		setContentView(R.layout.main);
	}

	/**
	 * 添加“登录”和“退出”菜单
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(1, MENU_LOGIN, 1, "登录");
		menu.add(1, MENU_EXIT, 2, "退出");
		return true;
	}

	/**
	 * 菜单事件处理
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case MENU_EXIT:
			showExitDailog();
			break;
		case MENU_LOGIN:
			showLoginDailog();
			break;
		default:
			return super.onOptionsItemSelected(item);
		}
		return true;
	}

	/**
	 * 显示退出对话框
	 */
	private void showExitDailog() {
		// 定义一个AlertDialog.Builder对象
		final Builder builder = new AlertDialog.Builder(context);

		builder.setIcon(android.R.drawable.ic_menu_help);// 设置对话框图标
		builder.setTitle("退出确认");// 设置标题
		builder.setMessage("您确定要退出吗?");// 设置显示内容
		// 为对话框添加一个确定按钮,并添加事件处理
		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				// 如果点确定,则退出
				DialogDemoActivity.this.finish();
			}
		});

		// 为对话框添加一个取消按钮,并添加事件处理
		builder.setNeutralButton("取消", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				dialog.dismiss();
			}
		});
		// 创建并显示对话模型
		builder.create().show();
	}

	/**
	 * 显示登录对话框
	 */
	private void showLoginDailog(){
		LayoutInflater factory=LayoutInflater.from(context);  
        //得到自定义对话框  
        final View loginDialogView=factory.inflate(R.layout.login_dailog, null);
       //创建对话框  
        final Builder builder = new AlertDialog.Builder(context);
        builder.setView(loginDialogView);//设置自定义对话框样式
        builder.setTitle("用户登录");
        //取消按钮
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});

        //登录按钮
        builder.setPositiveButton("登录", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				EditText et_username = (EditText)loginDialogView.findViewById(R.id.et_username);
				EditText et_password = (EditText)loginDialogView.findViewById(R.id.et_password);
				// 用户名不密码不能为空
				if ("".equals(et_username.getText().toString())
						&&"".equals(et_password.getText().toString())) {
					Builder mBuilder =new AlertDialog.Builder(context);
					mBuilder.setTitle("错误")
							.setIcon(android.R.drawable.ic_dialog_alert)
							.setPositiveButton("用户名或密码不能为空", null)
							.create()
							.show();
					return;
				}

				//用户名和密码不为空时开始"登录"
				 mProgressDialog = ProgressDialog.show(context, "登录", "正在验证用户名和密码",true);
				 new Thread()  
                 {  
                     public void run()  
                     {  
                         try  
                         {  
                             sleep(5000);  
                         }catch(Exception e)  
                         {  
                             e.printStackTrace();  
                         }finally  
                         {  
                             //登录结束,取消mProgressDialog对话框  
                        	 mProgressDialog.dismiss();
                         }  
                     }  
                 }.start();
			}
		});

        //显示登录对话框
        builder.create().show();
	}

}

菜单布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:gravity="left"
        android:text="用户名"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/et_username"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:autoText="false"
        android:capitalize="none"
        android:gravity="fill_horizontal"
        android:scrollHorizontally="true"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/tv_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:gravity="left"
        android:password="true"
        android:text="密码"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:autoText="false"
        android:capitalize="none"
        android:gravity="fill_horizontal"
        android:password="true"
        android:scrollHorizontally="true"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

使用Dialog主题: 另外一种简单的显示对话框的方式是让Activity以Dialog的方式来显示 ,这种Activity被称作浮动Activity。这种Activity可以通过配置它的主题来实现,我们可以在AndroidManifest.xml中进行类似如下的配置:

<activity
android:name=”.DialogActivity”
android:label=”@string/activity_dialog”
android:theme=”@android:style/Theme.Dialog”>
…
</activity>