对话框Dialog的使用

对对话框是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;
     	}    	
     }
 }

程序运行图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值