前言

  对话框对于应用也是必不可少的一个组件,在Android中也不例外,对话框对于一些提示重要信息,或者一些需要用户额外交互的一些内容很有帮助。本篇博客就讲解一下Android下对话框的使用,在本篇博客中,将了解到对话框的一些常规属性的设置,以及各式的对话框的使用,并都会提供小Demo来展示所有的效果。

Dialog

  Dialog,对话框,一个对话框就是一个小窗口,并不会填满整个屏幕,通常是以模态显示,要求用户必须采取行动才能继续进行剩下的操作。

  Android提供了丰富的对话框支持,它提供了如下4中常用的对话框:

AlertDialog:警告对话框,使用最广泛功能最丰富的一个对话框。
ProgressDialog:进度条对话框,只是对进度条进行了简单的封装。
DatePickerDialog:日期对话框。
TimePickerDialog:时间对话框。
  所有的对话框,都是直接或间接继承自Dialog类,而AlterDialog直接继承自Dialog,其他的几个类均继承自AlterDialog。

AlertDialog

  AlertDialog继承自Dialog类,对于Android内置的AlterDialog,它可以包含一个标题、一个内容消息或者一个选择列表、最多三个按钮。而创建AlterDialog推荐使用它的一个内部类AlterDialog.Builder创建。使用Builder对象,可以设置AlterDialog的各种属性,最后通过Builder.create()就可以得到AlterDialog对象,如果只是还需要显示这个AlterDialog,一般可以直接使用Builder.show()方法,它会返回一个AlterDialog对象,并且显示它。

  如果仅仅是需要提示一段信息给用户,那么就可以直接使用AlterDialog的一些属性设置提示信息,涉及到的方法有:

AlterDialog create():根据设置的属性,创建一个AlterDialog。
AlterDialog show():根据设置的属性,创建一个AlterDialog,并且显示在屏幕上。
AlterDialog.Builder setTitle():设置标题。
AlterDialog.Builder setIcon():设置标题的图标。
AlterDialog.Builder setMessage():设置标题的内容。
AlterDialog.Builder setCancelable():设置是否模态,一般设置为false,表示模态,要求用户必须采取行动才能继续进行剩下的操作。
  Tips:AlterDialog.Builder的很多设置属性的方法,返回的均是这个AlterDialog.Builder对象,所以可以使用链式方式编写代码,这样更方便。

  当一个对话框调用了show()方法后,展示到屏幕上,如果需要消除它,可以使用DialogInterface接口声明的两个方法,cancel()和dismiss()使对话框取或者消除,这两个方法的作用是一样的,不过推荐使用dismiss()。Dialog和AlterDialog都实现了DialogInterface接口,所以只要是对话框,均可以使用这两个方法来消除对话框。

  下面通过一个简单的Demo,先看看AlterDialog是如何提示信息的:

  示例:

  1. btnGeneral.setOnClickListener(new View.OnClickListener() {
  2.  
  3. @Override
  4. public void onClick(View v) {
  5. // TODO Auto-generated method stub
  6. AlertDialog.Builder builder = new AlertDialog.Builder(
  7. MainActivity.this);
  8. builder.setTitle("提示");
  9. builder.setMessage("这是一个普通的对话框!");
  10. builder.setIcon(R.drawable.ic_launcher);
  11. builder.setCancelable(false);
  12. builder.setPositiveButton("知道了!", new OnClickListener() {
  13. @Override
  14. public void onClick(DialogInterface dialog, int which) {
  15. dialog.cancel();
  16. }
  17. });
  18. builder.create().show();
  19. }
  20. });

展示效果:

<ignore_js_op> 
AlterDialog的按钮

  AlterDialog内置了三个按钮,可以直接使用setXxxButton()方法进行设置,对于一般的对话框,使用三个按钮基本上也够用了,下面是这三个方法的签名:

  1. btnButtons.setOnClickListener(new View.OnClickListener() {
  2.  
  3. @Override
  4. public void onClick(View v) {
  5. // TODO Auto-generated method stub
  6. AlertDialog.Builder builder = new AlertDialog.Builder(
  7. MainActivity.this);
  8. builder.setTitle("提示");
  9. builder.setMessage("这是一个多按钮普通的对话框!");
  10. builder.setIcon(R.drawable.ic_launcher);
  11. builder.setPositiveButton("确定", new OnClickListener() {
  12.  
  13. @Override
  14. public void onClick(DialogInterface dialog, int which) {
  15. Toast.makeText(MainActivity.this, "确定被点击",
  16. Toast.LENGTH_SHORT).show();
  17. dialog.dismiss();
  18. }
  19. });
  20. builder.setNegativeButton("否定", new OnClickListener() {
  21.  
  22. @Override
  23. public void onClick(DialogInterface dialog, int which) {
  24. // TODO Auto-generated method stub
  25. Toast.makeText(MainActivity.this, "否定被点击",
  26. Toast.LENGTH_SHORT).show();
  27. dialog.dismiss();
  28. }
  29. });
  30. builder.setNeutralButton("忽略", new OnClickListener() {
  31.  
  32. @Override
  33. public void onClick(DialogInterface dialog, int which) {
  34. // TODO Auto-generated method stub
  35. Toast.makeText(MainActivity.this, "忽略被点击",
  36. Toast.LENGTH_SHORT).show();
  37. dialog.cancel();
  38. }
  39. });
  40. builder.show();
  41. }
  42. });

展示效果:

AlterDialog的列表形式

  AlterDialog除了展示一些提示信息,还可以展示一种列表的形式,需要使用到Builder.setItems(CharSequence[] items,DialogInterface.OnClickListener listener)方法进行设置,它需要传递一个CharSequenece类型的数组,以绑定列表的数据,它同样需要传递一个DialogInterface.OnClickListener接口,以响应列表项的点击,而这个接口中onClick方法的which参数,为当前点击触发项的items中的下标。

  示例:

AlterDialog.Builder setPositiveButton(CharSquence text , DialogInterFace.OnClickListener):一个积极的按钮,一般用于“OK”或者“继续”等操作。
AlterDialog.Builder setNegativeButton(CharSquence text , DialogInterFace.OnClickListener):一个负面的按钮,一般用于“取消”操作。
AlterDialog.Builder setNeutralButton(CharSquence text , DialogInterFace.OnClickListener):一个比较中性的按钮,一般用于“忽略”、“以后提醒我”等操作。
  上面介绍的DialogInterface接口,还提供了一系列的事件响应,这三个按钮均需要传递一个DialogInterFace.OnClickListener接口对象,实现其点击事件的触发,在这个接口中需要实现一个onClick(DialogInterface dialog,int which),dialog为当前触发事件的对话框对象接口,可以直接强制转换为AlterDialog进行操作;which为点击按钮的标识符,是一个整形的数据,对于这三个按钮而言,每个按钮使用不同的int类型数据进行标识:Positive(-1)、Negative(-2)、Neutral(-3)。

  而除了专门为按钮点击实现的DialogInterFace.OnClickListener事件外,DialogInterface还提供了一些其他的事件,供Dialog对象响应,这些事件只是对Dialog声明周期各个状态的响应,一看就明白了,就不再详细讲解了,下面是这几个事件的说明:

interface DialogInterface.OnCancelListener:当对话框调用cancel()方法的时候触发。
interface DialogInterface.OnDismissListener:当对话框调用dismiss()方法的时候触发。
interface DialogInterface.OnShowListener:当对话框调用show()方法的时候触发。
interface DialogInterface.OnMultiChoiceListener:当对话框使用多选列表,并且选中的时候触发。
  示例:

  1. btnListView.setOnClickListener(new View.OnClickListener() {
  2.  
  3. @Override
  4. public void onClick(View v) {
  5. // TODO Auto-generated method stub
  6. AlertDialog.Builder builder = new AlertDialog.Builder(
  7. MainActivity.this);
  8. builder.setTitle("请选择城市");
  9. //items使用全局的finalCharSequenece数组声明
  10. builder.setItems(items, new OnClickListener() {
  11. @Override
  12. public void onClick(DialogInterface dialog, int which) {
  13. // TODO Auto-generated method stub
  14. String select_item = items[which].toString();
  15. Toast.makeText(MainActivity.this,
  16. "选择了---》" + select_item, Toast.LENGTH_SHORT)
  17. .show();
  18. }
  19. });
  20. builder.show();
  21. }
  22. });

效果展示: 

AlterDialog的单选列表

  AlterDialog还可以使用一种单选的列表样式,使用Builder.setSingleChoiceItems(CharSequenece[] items,int checkedItem,DialogInterface.OnClickListener listener),这个方法具有多项重载,主要是为了应对不同的数据源,items为列表项数组,checkedItem为初始选项,listener为点击响应事件。有时候并不一定需要选中之后就关闭对话框,可以设置两个按钮,用于确定选择。

  示例:

  1. btnListViewSingle.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. // TODO Auto-generated method stub
  5. AlertDialog.Builder builder = new AlertDialog.Builder(
  6. MainActivity.this);
  7. builder.setTitle("请选择一下城市");
  8. builder.setSingleChoiceItems(items, 1, new OnClickListener() {
  9.  
  10. @Override
  11. public void onClick(DialogInterface dialog, int which) {
  12. // TODO Auto-generated method stub
  13. String select_item = items[which].toString();
  14. Toast.makeText(MainActivity.this,
  15. "选择了--->>" + select_item, Toast.LENGTH_SHORT)
  16. .show();
  17. }
  18. });
  19. builder.setPositiveButton("确定", new OnClickListener() {
  20. @Override
  21. public void onClick(DialogInterface dialog, int which) {
  22. dialog.dismiss();
  23. }
  24. });
  25. builder.show();
  26. }
  27. });

效果展示:

AlterDialog多选列表

  AlterDialog除了单选列表,还有多选的列表。可以使用Builder.setMultiChoiceItems(CharSequence[] items,boolean[] checkedItems,DialogInterface.OnMultiChoiceClickListener listener),这个方法也同样具有多样重载,对于这个方法,items以一个数组为数据源;checkedItems是默认的选项,因为是多选列表,所以如果设置需要全部设置,如果没有默认选中,则传Null;listener为多选项点击触发事件。

  示例:

  1. btnListViewMulti.setOnClickListener(new View.OnClickListener() {
  2.  
  3. @Override
  4. public void onClick(View v) {
  5. // TODO Auto-generated method stub
  6. AlertDialog.Builder builder = new AlertDialog.Builder(
  7. MainActivity.this);
  8. builder.setTitle("请选择城市");
  9. builder.setMultiChoiceItems(items, new boolean[] { true, false,
  10. true }, new OnMultiChoiceClickListener() {
  11. @Override
  12. public void onClick(DialogInterface dialog, int which,
  13. boolean isChecked) {
  14. // TODO Auto-generated method stub
  15. String select_item = items[which].toString();
  16. Toast.makeText(MainActivity.this,
  17. "选择了--->>" + select_item, Toast.LENGTH_SHORT)
  18. .show();
  19. }
  20. });
  21. builder.setPositiveButton("确定", new OnClickListener() {
  22. @Override
  23. public void onClick(DialogInterface dialog, int which) {
  24. dialog.dismiss();
  25. }
  26. });
  27. builder.show();
  28. }
  29. });

效果展示:

AlertDialog自定义样式

  有些时候,Android自带的一些样式设置已经无法满足需求了,那么可以使用自定义样式,自定义个XML布局文件,用这个文件的内容作为AlertDialog的样式展示在屏幕上,这样就可以灵活定制对话框了。对于定制的XML文件,可以使用LayoutInflater.from(Context).inflate(int,ViewGroup)的方式对其进行动态加载,然后使用Builder.setView(View)把加载的视图与Builder对象进行关联,最后正常show()即可。

  布局代码:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin"
  10. tools:context=".MainActivity" >
  11.  
  12. <Button
  13. android:id="@+id/btnGeneral"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="普通对话框" />
  17.  
  18. <Button
  19. android:id="@+id/btnButtons"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:text="多按钮的普通对话框" />
  23.  
  24. <Button
  25. android:id="@+id/btnListView"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:text="列表选择对话框" />
  29.  
  30. <Button
  31. android:id="@+id/btnListViewSingle"
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:text="单选列表选择对话框" />
  35.  
  36. <Button
  37. android:id="@+id/btnListViewMulti"
  38. android:layout_width="wrap_content"
  39. android:layout_height="wrap_content"
  40. android:text="多选列表选择对话框" />
  41.  
  42. <Button
  43. android:id="@+id/btnProgressDialog"
  44. android:layout_width="wrap_content"
  45. android:layout_height="wrap_content"
  46. android:text="滚动等待对话框" />
  47.  
  48. <Button
  49. android:id="@+id/btnProgressDialogH"
  50. android:layout_width="wrap_content"
  51. android:layout_height="wrap_content"
  52. android:text="进度条对话框" />
  53. <Button
  54. android:id="@+id/btnCustomDialog"
  55. android:layout_width="wrap_content"
  56. android:layout_height="wrap_content"
  57. android:text="自定义对话框" />
  58. </LinearLayout>

实现代码:

  1. btnCustomDialog.setOnClickListener(new View.OnClickListener() {
  2.  
  3. @Override
  4. public void onClick(View v) {
  5. AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
  6. View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_signin,null);
  7. Button btn=(Button)view.findViewById(R.id.btnCustom);
  8. btn.setOnClickListener(new View.OnClickListener() {
  9.  
  10. @Override
  11. public void onClick(View v) {
  12. // TODO Auto-generated method stub
  13. alertDialog.dismiss();
  14. Toast.makeText(MainActivity.this, "表单填写完成",
  15. Toast.LENGTH_SHORT).show();
  16. }
  17. });
  18. builder.setView(view);
  19. alertDialog=builder.show();
  20. }
  21. });

效果展示:

ProgressDialog

  有些时候,只是需要提示用户等待,比如在执行耗时操作等的时候,可以使用进度对话框来显示一个进度信息,提示用户等待,这个时候可以使用ProgressDialog。ProgressDialog的使用方式大部分可以参见ProgressBar,其实就是一个封装了ProgressBar的对话框。

  ProgressDialog有两种显示方式,一种是以一个滚动的环状图标,可以显示一个标题和一段文本内容的等待对话框;另外一种是带刻度的进度条,和常规的进度条用法一致。两种样式通过ProgressDialog.setProgressStyle(int style)设置,可以通过ProgressDialog的两个常量进行设置:STYLE_HORIZONTAL:刻度滚动;STYLE_SPINNER:图标滚动,默认选项。

  对于图标滚动,可以使用两种方式实现,一种是常规的调用构造函数,再设置对应的属性;另外一种是直接使用ProgressDialog的静态方法show(),直接返回一个ProgressDialog对象,并且调用show()方法。

  示例:

  1. btnProgressDialog.setOnClickListener(new View.OnClickListener() {
  2.  
  3. @Override
  4. public void onClick(View v) {
  5. // 第一种方法,使用ProgressDialog构造函数
  6. progressDialog = new ProgressDialog(MainActivity.this);
  7. progressDialog.setIcon(R.drawable.ic_launcher);
  8. progressDialog.setTitle("等待");
  9. progressDialog.setMessage("正在加载....");
  10. progressDialog.show();
  11. //第二种方法,使用静态的show方法
  12. //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加载....", false, false);
  13. new Thread(new Runnable() {
  14.  
  15. @Override
  16. public void run() {
  17. try {
  18. Thread.sleep(5000);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. finally{
  23. progressDialog.dismiss();
  24. }
  25. }
  26. }).start();
  27. }
  28. });

效果展示:

  对于有刻度的ProgressDialog,除了从AlertDialog中继承来的属性,有一些必要的属性需要设置,以下方法都有对于的getter方法:

setMax(int max):最大刻度。
setProgress(int value):第一进度。
setSecondaryProgress(int value):第二进度。
  示例:

  1. btnProgressDialog.setOnClickListener(new View.OnClickListener() {
  2.  
  3. @Override
  4. public void onClick(View v) {
  5. // 第一种方法,使用ProgressDialog构造函数
  6. progressDialog = new ProgressDialog(MainActivity.this);
  7. progressDialog.setIcon(R.drawable.ic_launcher);
  8. progressDialog.setTitle("等待");
  9. progressDialog.setMessage("正在加载....");
  10. progressDialog.show();
  11. //第二种方法,使用静态的show方法
  12. //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加载....", false, false);
  13. new Thread(new Runnable() {
  14.  
  15. @Override
  16. public void run() {
  17. try {
  18. Thread.sleep(5000);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. finally{
  23. progressDialog.dismiss();
  24. }
  25. }
  26. }).start();
  27. }
  28. });

【Android】Android--Dialog的更多相关文章

  1. 【朝花夕拾】Android自定义View篇之(八)多点触控(上)MotionEvent简介

    前言 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2 ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 【Android】Android 移动应用数据到SD

    [Android]Android 移动应用数据到SD 在应用的menifest文件中指定就可以了,在 <manifest> 元素中包含android:installLocation 属性, ...

  4. 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏

    转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Andro ...

  5. 【Android】【录音】Android录音--AudioRecord、MediaRecorder

    [Android][录音]Android录音--AudioRecord.MediaRecorder Android提供了两个API用于实现录音功能:android.media.AudioRecord. ...

  6. 【译】Android系统简介—— Activity

    续上一篇,继续介绍Android系统.上一篇: [译]Android系统简介 本文主要介绍构建Android应用的一些主要概念: Activity Activity是应用程序中一个单独的有UI的页面( ...

  7. 【转】Android:Layout_weight的深刻理解

    原文网址:http://mobile.51cto.com/abased-375428.htm 本文详细介绍了Android布局中Layout_weight的属性,它是用来分配属于空间的一个属性,你可以 ...

  8. 【转】android开发中关于模拟器emulation的常见问题

    [转]android开发中关于模拟器emulation的常见问题 Trouble: 无法启动android模拟器,提示 XDM authorization key matches an existin ...

  9. 【新版】Android技术博客精华汇总

    [新版]Android技术博客精华汇总(原文链接内持续更新) http://www.apkbus.com/thread-313856-1-1.html Kotlin Kotlin学习资料汇总 http ...

  10. 【朝花夕拾】Android性能篇之(六)Android进程管理机制

    前言        Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...

随机推荐

  1. Entity Framework应用:管理并发

    理解并发 并发管理解决的是允许多个实体同时更新,实际上这意味着允许多个用户同时在相同的数据上执行多个数据库操作.并发是在一个数据库上管理多个操作的一种方式,同时遵守了数据库操作的ACID属性(原子性. ...

  2. ggplot饼图

    目录: 原始图样 如何去除饼图中心的杂点 如何去除饼图旁边的标签 如何去掉左上角多出来的一横线 如何去掉图例的标题,并将图例放到上面 如何对图例的标签加上百分比 如何让饼图的小块按顺时针从大到小的顺序 ...

  3. 如何使用GameObject类发送消息

    一.GameObject发送消息的方法 GameObject类有三个方法可以实现发送消息,即SendMessage.BroadcastMessage和SendMessageUpwards.但是它们之间 ...

  4. sqlserver 字符串split

    select value from TF_NJVALUES('3C457A2D-188B-4D99-A822-2968054E1FB8,3C457A2D-188B-4D99-A822-2968054E ...

  5. App 应用通过网页打开 App Store

    NSURL *url = nil; if ([[[UIDevice currentDevice] systemVersion] intValue] >= 7.0) { //iOS7 使用旧的网址 ...

  6. 设置div滚动条

    这个是很常见的一个任务了,基本是通过CSS去实现滚动条. 滚动条 设置是否显示滚动条主要是在CSS中设置下列的属性: 代码如下: overflow:visible|auto|hidden|scroll ...

  7. Oracle:create pfile from spfile:rac下要小心该操作啊!

    默认在原位置创建一个pfile的ora初始化参数文件!! 这在rac下会带来问题,因为rac下,当使用asm存储时,instance的启动参数文件就是pfile(其内容是指向一个spfile).如果不 ...

  8. ChemDraw Std 14如何标记同位素

    ChemDraw软件是一款专业高效的化学绘图工具,能够绘制各种复杂的结构方程式,在基础化学.有机化学.材料化学等领域得到广泛应用.而ChemDraw Std 14 作为ChemDraw 的最新版本,增 ...

  9. SRCNN之后的深度学习超分辨率

    SRCNN开山之作 IDN 信息蒸馏网络information distillation network(IDN) Fast and Accurate Single Image Super-Resol ...

  10. linux Redhat 6环境上通过源码包安装DRBD 8

    环境描述: 操作系统版本:Red Hat Enterprise Linux Server release 6.6 (Santiago) 系统内核版本:2.6.32-504.el6.x86_64 DRB ...