`
longgangbai
  • 浏览: 7356200 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ProgressDialog进度条和AlertDialog弹出对话框的使用

 
阅读更多

显示对话框

    对话框经常作为Activity的一部分来创建和显示。你通常应该从protected Dialog Activity.onCreateDialog (int id) 回调方法里创建对话框。当你使用这个回调函数时,Android系统会有效的设置这个Activity为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到Activity上。这样,每个对话框继承这个Activity的特定属性。比如,当一个对话框打开时,菜单键显示为这个Activity定义的选项菜单,音量键修改Activity使用的音频流

  1. 注意: 如果你决定在onCreateDialog()方法之外创建一个对话框,它将不会被附着到活动上。不过,你可以通过setOwnerActivity(Activity)把它附着到一个活动上。 

    当你想要显示一个对话框时,调用showDialog(int id) 方法并传递一个唯一标识这个对话框的整数。

    当对话框第一次被请求时,Android从你的Activity中调用onCreateDialog(int id),你应该在这里初始化这个对话框Dialog。这个回调方法被传以和showDialog(int id)相同的ID。当你创建这个对话框后,在Activity的最后返回这个对象。

    在对话框被显示之前,Android还调用了可选的回调函数onPrepareDialog(int id, Dialog). 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而onCreateDialog(int) 仅在对话框第一次打开时被调用如果你不定义onPrepareDialog(),那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的ID,和在onCreateDialog()中创建的对话框对象。(个人理解是,在本Activity里第一次show某个Dialog,则先调用onCreateDialog,得到返回的Dialog对象并挂靠在Activity,保存Dialog对象的引用,然后才显示Dialog。这样子,下次再show Dialog就不用重新创建Dialog对象,而是重用旧的)

    定义onCreateDialog(int) onPrepareDialog(int, Dialog) 回调函数的最佳方法是使用一个switch 语句来检查传递进来的id 参数。每个case 应该检查一个唯一的对话框ID然后创建和定义相应的对话框。比如,想象一下一个游戏使用两个不同的对话框:一个用来指示这个游戏已经暂停而另一个来指示游戏结束。首先,为每个对话框定义一个常量:

  1. static final int DIALOG_PAUSED_ID = 0
  2. static final int DIALOG_GAMEOVER_ID = 1

然后,为每一个ID用一个switch case定义这个onCreateDialog(int) 回调函数:

  1. protected Dialog onCreateDialog(int id) { 
  2.     Dialog dialog; 
  3.     switch(id) { 
  4.     case DIALOG_PAUSED_ID: 
  5.         // do the work to define the pause Dialog 
  6.         break
  7.     case DIALOG_GAMEOVER_ID: 
  8.         // do the work to define the game over Dialog 
  9.         break
  10.     default
  11.         dialog = null
  12.     } 
  13.     return dialog; 

当是时候显示其中之一的对话框时,使用对话框ID调用showDialog(int):

  1. showDialog(DIALOG_PAUSED_ID); 
 

消除对话框Dismissing a Dialog

    当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。

    如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。

 

使用消除侦听器Using dismiss listeners

    如果你希望你的应用程序在一个对话框消亡的时候执行一些流程,那么你应该附着一个on-dismiss侦听器到对话框上。

  1. @Override 
  2. protected void onPrepareDialog(int id, Dialog dialog) { 
  3.     switch(id){ 
  4.     case PROGRESS_DIALOG: 
  5.         dialog.setOnDismissListener(new DialogInterface.OnDismissListener()
  6.             @Override 
  7.             public void onDismiss(DialogInterface dialog) { 
  8.                 Toast.makeText(getApplicationContext(), 
  9.                         "dismiss listener!"
  10.                         Toast.LENGTH_SHORT) 
  11.                 .show(); 
  12.             } 
  13.         }); 
  14.     } 

    然而, 请注意对话框也可以被“取消”。这是一个表明对话框被用户显示取消的特殊情况。这将在用户按“返回”按钮时发生,或者这个对话框显示的调用cancel() (也许通过对话框上的一个“取消”按钮)。当一个对话框被取消时,这个OnDismissListener 依然会被通知到,但是如果你希望在对话框被显示取消时被通知到(而不是通常的消除方式),那么你应该通过setOnCancelListener()注册一个DialogInterface.OnCancelListener

    目前个人学习发现,一般情况下,调用dialog.cancel()就会触发onCancelLister。而点击AlertDialog的NegativeButton (Cancel/No)是不会触发的。对于setOnCancelListener()要注意的是,这里有两个setOnCancelListener(),但返回值不同:

  1. //AlertDialog.Builder调用的 
  2. public AlertDialog.Builder setOnCancelListener (DialogInterface.OnCancelListener onCancelListener) 
  3.  
  4. //Dialog调用的 
  5. public void setOnCancelListener (DialogInterface.OnCancelListener listener) 
 

警告对话框AlertDialog的使用

    为了创建一个警告对话框,使用AlertDialog.Builder 子类。通过AlertDialog.Builder(Context)获取一个构造器然后使用这个类的公共方法来定义警告对话框的所有属性。当得到构造器后,通过create().方法来获取警告对话框对象。有时我是不调用create()的,而是在设置好了后直接调用show()显示AlertDialog。

Dialog_buttonDialog_buttonDialog_button

增加按钮Adding buttons

    这就是我一开始很想知道的究竟如何添加Yes/No,Ok/Cancel这样的按钮。原来是通过setPositiveButton(...)响应Yes/Ok的点击,setNeutralButton(...)响应中立行为的点击,setNegativeButton(...)响应No/Cancel的点击。注意,只能各自设置一个按钮来响应点击事件。

  1. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  2. builder.setMessage("Are you sure you want to exit?"
  3.        .setCancelable(false
  4.        .setPositiveButton("Yes"new DialogInterface.OnClickListener() { 
  5.            public void onClick(DialogInterface dialog, int id) { 
  6.                 MyActivity.this.finish(); 
  7.            } 
  8.        }) 
  9.        .setNegativeButton("No"new DialogInterface.OnClickListener() { 
  10.            public void onClick(DialogInterface dialog, int id) { 
  11.                 dialog.cancel(); 
  12.            } 
  13.        }); 
  14. AlertDialog alert = builder.create(); 

    首先,为这个对话框添加一个消息setMessage(CharSequence)。然后,开始函数链并设置该对话框为不能取消not cancelable (因此用户不能使用返回按钮关闭这个对话框)。对每个按钮,使用任一set...Button() 方法,比如setPositiveButton(),该方法接受按钮名称以及一个定义用户选中按钮后所采取动作的DialogInterface.OnClickListener

增加一个列表Adding a list
  1. final CharSequence[] items = {"Red""Green""Blue"}; 
  2.   
  3. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  4. builder.setTitle("Pick a color"); 
  5. builder.setItems(items, new DialogInterface.OnClickListener() { 
  6.     public void onClick(DialogInterface dialog, int item) { 
  7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
  8.     } 
  9. }); 
  10. AlertDialog alert = builder.create(); 

    首先,用setTitle(CharSequence)方法给对话框添加一个标题。然后,添加用setItems()添加一个可选项列表,该列表接受一组显示的items和一个DialogInterface.OnClickListener 来定义用户选中按钮后所采取动作。

增加复选框和单选按钮

    要在对话框里创建一个多选项列表(checkboxes)或者单选项(radio buttons),可分别调用setMultiChoiceItems()setSingleChoiceItems() 方法。如果你在onCreateDialog()回调函数中创建这些可选列表,Android会帮你管理列表状态。只要这个活动是激活的,对话框会记住之前选中的items,但如果用户退出这个活动,用户选择将丢失。

    注意: 为了在用户离开或暂停这个活动的时候能够保存选择,你必须通过活动生命期Activity Lifecycle来恰当的保存和恢复设置。为了永久保存选项,即使活动进程被完全终止,你需要使用数据存储Data Storage技术。

  1. final CharSequence[] items = {"Red""Green""Blue"}; 
  2.   
  3. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  4. builder.setTitle("Pick a color"); 
  5. builder.setSingleChoiceItems(items, -1new DialogInterface.OnClickListener() { 
  6.     public void onClick(DialogInterface dialog, int item) { 
  7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
  8.     } 
  9. }); 
  10. AlertDialog alert = builder.create(); 

    setSingleChoiceItems() 的第二个参数是一个checkedItem整型数值,指示了基于0的缺省选择项的位置。“-1”代表不会有默认选择项。

 

进度对话框Progress Dialog的使用

    ProgressDialogAlertDialog类的一个扩展,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。

    可以简单地通过调用ProgressDialog.show()方法来显示一个进度对话框,而通过onCreateDialog(int)回调管理这个对话框是可选的,如下所示:

  1. ProgressDialog.show(this// context 
  2.     ""// title 
  3.     "Loading. Please wait..."// message 
  4.     true); //进度是否是不确定的,这只和创建进度条有关 

进度对话框的缺省类型是一个旋转轮,运行看到的是以下效果:

ProgressDialog

    由于ProgressDialog是AlertDialog的扩展类,所以ProgressDialog也能设置按钮,比如一个取消下载的按钮。不过要注意的是,和前面的AlertDialog.Builder不同,ProgressDialog是调用AlertDialogsetButtonsetButton2setButton3函数,这些函数没有明确哪个是正面/中立/负面的,由我们决定。

显示进度条Showing a progress bar

而选择动画进度条显示进度:

1.   用类构造器初始化进度对话框,ProgressDialog(Context)。

2.   用setProgressStyle(int)方法设置进度风格为"STYLE_HORIZONTAL"以及设置其它属性,比如消息。

创建ProgressDialog大概是这样的:

  1. ProgressDialog progressDialog = new ProgressDialog(getApplicationContext());  
  2.   
  3. progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  4. progressDialog.setIcon(R.drawable.alert_dialog_icon);  
  5. progressDialog.setMessage("Loading...");  
  6. progressDialog.setCancelable(false);  

3.   当你准备显示这个对话框时,调用show()或者从onCreateDialog(int)回调中返回ProgressDialog。

4.   你可以通过调用setProgress(int)设置当前进度百分比或者调用incrementProgressBy(int)方法增加进度值。

官方文档提供了如何在另一线程来跟踪进程进度,让进度值变化。对此可以参考http://androidappdocs.appspot.com/guide/topics/ui/dialogs.html里面的代码。也可以查看后面的文章《有关Android线程的学习》里面的例子,看看如何使用Handler, Message机制!

 

创建自定义对话框Creating a Custom Dialog

    创建自定义对话框,首先要创建一个Layout xml 文件,在此不啰嗦了。然后加载Layout有两种方法,也是非常熟悉的那两种方法:

    1. setContentView(int resources id)

    2. 利用LayoutInflater加载

   官方还提示我们,一般使用Dialog类来创建对话框,是需要setTitle的,不设置的话,标题占用的空间保持为空,但仍然可见。而不想要那个标题,那应该使用警告对话框AlertDialog来创建自定义对话框。然而,因为警告对话框可以很简单的通过AlertDialog.Builder 类来创建,你并不需要访问上面使用的setContentView(int) 方法。相反,你必须使用setView(View),则需要使用LayoutInflater来加载Layout得到View。

     

常用控件的使用:

进度条:

@Override
		public void onClick(View v)
		{
			//设定Handler对象,主要是处理新开线程完毕后交给主线程来处理的数据
			mhandler = new Handler(){
				@Override
				public void handleMessage(Message msg)
				{
					String name =(String)msg.obj;
					Toast.makeText(ProgressDialogActivity.this, name + "把师傅救出来了", 1).show();
				}
			};
			//创建ProgressDialog对象
			Dialog = new ProgressDialog(this);
			//设定ProgressDialog的样式为进度条
			Dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			//设定ProgressDialog的最大值为100,这里就是100只小妖怪啦
			Dialog.setMax(100);
			//设定ProgressDialog不能取消,你不能半途而废啊,当然要100只打完啦
			Dialog.setCancelable(false);
			
			String name = null;
			
			switch (v.getId())
			{
			case R.id.wukong:
				//设定名字,看是谁在打妖怪啊
				name = "孙悟空";
				Dialog.setTitle(name);
				//图片
				Dialog.setIcon(R.drawable.wukong);
				//消息
				Dialog.setMessage("悟空在打妖怪");
				//自定义打斗的方法
				doFlight(name);

				break;

			case R.id.bajie:
				
				//同上
				name = "猪八戒";
				Dialog.setTitle(name);
				Dialog.setIcon(R.drawable.bajie);
				Dialog.setMessage("八戒在打妖怪");
				doFlight(name);

				break;

			case R.id.shaseng:
				
				//同上
				name = "沙和尚";
				Dialog.setTitle(name);
				Dialog.setIcon(R.drawable.shaseng);
				Dialog.setMessage("沙僧在打妖怪");
				doFlight(name);

				break;
			}

			

		}

		private void doFlight(final String name)
		{
			//显示ProgressDialog
			Dialog.show();
			
			//新开一条线程
			new Thread()
			{
				//打完妖怪的数量
				int count = 0;
				public void run()
				{
					try
					{
						//打完妖怪小于100只的时候运行的方法
						while(count <= 100){
							Dialog.setProgress(count++);
							//睡眠0.2秒,你也得让他们休息一下啊,呵呵
							Thread.sleep(200);
						}
						Dialog.cancel();
						
						//给handler发送消息,看是谁在打妖怪,handler是主线程中的
						Message message = new Message();
						message.obj = name;
						mhandler.sendMessage(message);

					} catch (InterruptedException e)
					{
						Dialog.cancel();
					}
					
				};

			}.start();
			
		}

 

 

 

对话框的使用:

 

/**
		 * 登录框
		 */
		protected void dialog_show()
		{
			// 将Layout中的login.xml匹配给视图控件
			LayoutInflater inflater = LayoutInflater.from(this);
			final View view = inflater.inflate(R.layout.login, null);
			// 创建Dialog
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setTitle("登录框");
			builder.setView(view);
			builder.setPositiveButton("登录", new OnClickListener()
			{

				@Override
				public void onClick(DialogInterface dialog, int which)
				{
					// 取得login.xml中的账号EditText和密码EditText控件
					EditText user = (EditText) view.findViewById(R.id.user);
					EditText pass = (EditText) view.findViewById(R.id.pass);
					// 取得两个控件中的值
					String user_str = user.getText().toString();
					String pass_str = pass.getText().toString();
					// 验证账号和密码
					validate(user_str, pass_str);

				}
			});
			builder.setNegativeButton("取消", new OnClickListener()
			{

				@Override
				public void onClick(DialogInterface dialog, int which)
				{
					dialog.dismiss();
				}
			});
			// 这个很重要的,是dialog的显示功能,如果这个没有的话,是不会显示出来的
			builder.show();

		}

 

 

分享到:
评论

相关推荐

    4其他常用组件实验报告

    AlertDialog 组件的使用方法是通过在 Java 代码中创建 AlertDialog.Builder 对象,然后设置标题、消息、确定按钮和取消按钮,最后调用 show() 方法来弹出对话框。 五、ProgressDialog 组件 ProgressDialog 组件...

    Android学习笔记(八)——显示进度对话框

    进度对话框是一种特殊的对话框,它会在主界面之上弹出,显示当前任务的进度,让用户知道应用并没有卡住,而是正在处理数据。它们分为两种主要类型:indeterminate(不定量)和determinate(定量)。 1. ...

    8种常用Android的对话框示例

    AlertDialog是最基础的对话框类型,它包含一个标题、一个消息和一个或多个按钮。可以通过`AlertDialog.Builder`来创建,设置标题、消息、按钮及点击事件。例如: ```java AlertDialog.Builder builder = new ...

    Android菜单、对话框使用实例源码

    2. **PopupMenu**:`PopupMenu`通常在需要弹出临时选项时使用。我们可以在需要的位置显示它,如: ```java Button btn = findViewById(R.id.button); PopupMenu popup = new PopupMenu(this, btn); popup....

    android进度条

    实现弹出Dialog显示进度条,我们通常使用`ProgressDialog`或者自定义`DialogFragment`。`ProgressDialog`是Android SDK内置的一个类,可以方便地创建带进度条的对话框。以下是如何使用`ProgressDialog`的示例: ```...

    常用对话框的使用

    例如,在C#中,使用`System.Windows.Forms.MessageBox.Show()`方法即可弹出一个消息框,传入文本和按钮配置,如"确定"或"是/否"选项。 二、文件对话框 FileDialog FileDialog用于处理文件操作,包括打开、保存和...

    Android 对话框 Dialog使用实例讲解

    对话框是在当前的页面之上弹出的小窗口, 用于显示一些重要的提示信息, 提示用户的输入,确认信息,或显示某种状态.如 : 显示进度条对话框, 退出提示. 对话框的特点: 1, 当前界面弹出的小窗口. 2, 用户要与它进行交互, ...

    Android 普通对话框源码.zip

    - 为了提高用户体验,应合理使用对话框,避免频繁弹出,以免打断用户流程。 7. **注意事项** - 对话框不应滥用,以免影响用户的操作体验。对于非关键信息,通常推荐使用Toast或者Snackbar代替对话框。 - 在...

    Android 弹出层

    PopupWindow是另一种常用的弹出层,它可以实现更灵活的布局和交互。PopupWindow可以显示任意的View,包括自定义视图,它可以在屏幕上的任意位置显示。PopupWindow的显示效果可以调整为贴附在其他View的边缘,或者...

    android dialog 大合集 对话框 透明

    2. 自定义主题:通过在AndroidManifest.xml中定义,或在代码中使用`dialog.setTheme()`,可以改变对话框的外观和感觉,如背景颜色、边框等。 三、模态对话框 1. 模态对话框:阻塞用户对应用程序其他部分的交互,...

    Android对话框

    创建和使用进度对话框的步骤与普通对话框类似,但需调用`setProgressStyle()`和`setMessage()`方法来显示进度条和信息,并通过`progressDialog.setProgress()`更新进度。 总结,Android中的对话框是提供用户交互的...

    学习笔记----Android的对话框

    7. 弹出对话框的最佳实践: - 避免阻塞UI:对话框不应阻碍主线程,长时间任务应在子线程中执行。 - 提供明确的操作指示:对话框应清晰地告诉用户接下来会发生什么。 - 保持简洁:避免在对话框中放入过多信息或...

    Android弹出框

    在Android应用开发中,弹出框(通常称为对话框或者AlertDialog)是不可或缺的元素,它用于向用户展示重要信息、获取用户输入或者进行关键操作的确认。本篇将深入探讨Android弹出框的使用,包括它的类型、创建方法...

    android对话框

    - ProgressDialog:显示进度条的对话框,用于告知用户后台任务正在执行。 - DatePickerDialog/TimePickerDialog:用于选择日期和时间的对话框。 - AlertDialog.Builder:创建AlertDialog的便捷类,允许自定义...

    android webview 顶部进度条+旋转等待dialog例子

    此外,注意在Android API 26及以上版本,ProgressDialog已被弃用,应使用AlertDialog.Builder或自定义的DialogFragment替代。 文件名`android_webview_ProgressBar`可能包含了实现上述功能的Java源代码文件、布局...

    Android软件开发之盘点所有Dialog对话框大合集

    例如,在收到特定的广播消息时弹出自定义对话框,即使当前没有Activity处于活动状态也能正确显示。 #### 八、显示进度条Loading框架 最后一种对话框是一个简单的加载对话框,用于指示正在进行中的后台操作。它通常...

    Android dialog对话框用法实例.rar

    除了基础的AlertDialog,Android还提供了其他类型的Dialog,如ProgressDialog(显示进度条的对话框)、DatePickerDialog(日期选择对话框)和TimePickerDialog(时间选择对话框)等。这些对话框的使用方式与基础的...

    Android常用对话框源码

    底部弹出框是一种从屏幕底部滑出的对话框,常用于展示更多操作选项。`BottomSheetDialog`类是专为此设计的,可以通过`BottomSheetDialogFragment`或者自定义布局实现。源码中,`BottomSheetDialog`扩展了`Dialog`,...

    Android对话框精粹1

    - 可以通过修改对话框的主题或自定义样式,实现不同的弹出动画和效果,例如淡入淡出、平移等。 - `Window`类提供了`setWindowAnimations(int)`方法,可以设置对话框出现和消失的动画资源。 7. 使用注意事项: - ...

    android dialog 对话框

    在这个示例中,当用户点击“显示对话框”按钮时,将弹出一个简单的对话框,包含“确定”和“取消”两个按钮。点击这些按钮后,会显示相应的Toast消息。 通过以上介绍,你应该对Android中的`Dialog`有了基本的理解。...

Global site tag (gtag.js) - Google Analytics