转载至:http://www.kwstu.com/ArticleView/kwstu_20139682354515

前言

  对话框对于应用也是必不可少的一个组件,在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接口,所以只要是对话框,均可以使用这两个方法来消除对话框。

******************************************************************

补充:对话框式风格的窗口(不属于原文章)

原理:将显示窗口的Activity的风格设置为对话框风格

AndroidMainifest.xml文件:

<activity            android:launchMode="standard"            android:theme="@android:style/Theme.Dialog"  放在application中定义也行,            android:name="com.example.zongjie.MainActivity"                    android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity

注意:

Android4.0以上推荐使用android:theme="@android:style/Theme.Holo.DialogWhenLarge"


MainActivity.java

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.view_page);}

效果图:


Android Diaolog与AlertDialog用法实例_第1张图片


******************************************************************

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

  示例:

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

展示效果:

Android Diaolog与AlertDialog用法实例_第2张图片

AlterDialog的按钮

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

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

  展示效果:

Android Diaolog与AlertDialog用法实例_第3张图片

AlterDialog的列表形式

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

  示例:

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

Android Diaolog与AlertDialog用法实例_第4张图片

AlterDialog的单选列表

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

  示例:

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

  效果展示:

Android Diaolog与AlertDialog用法实例_第5张图片

AlterDialog多选列表

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

  示例:

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

  效果展示:

AlertDialog自定义样式

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

  布局代码:

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

  实现代码:

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

  效果展示:

Android Diaolog与AlertDialog用法实例_第6张图片

ProgressDialog

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

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

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

  示例:

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

  效果展示:

Android Diaolog与AlertDialog用法实例_第7张图片

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

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

  示例:

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

  效果展示:

Android Diaolog与AlertDialog用法实例_第8张图片

  


总结

  以上就介绍了常用的对话框的内容,DatePickerDialog和TimePickerDialog在另外一篇博客中有介绍到,可以看看:Android--UI之DatePicker、TimePicker...。 从最新的官方文档上了解到,推荐使用FragmentDialog来操作Dialog,这样便于管理,有关Fragment的内容,还没有介绍,以后介绍 了Fragment之后再说说怎么使用FragmentDialog来创建对话框。在源码里有一个FragmentDialog的简单例子,有兴趣的可以 下载下来看看。


更多相关文章

  1. Android高手进阶教程(十六)---Android中Intent传递对象的两种方
  2. 64位win7下Android SDK Manager闪退的解决方法
  3. 最新Android Studio更换应用图标方法
  4. Android 中几种更新UI界面的方法
  5. 安卓(Android)系统的检测方法
  6. android 控制按钮各个状态的样式
  7. 【Android】私有目录获取方法
  8. Android 按钮点击切换背景,同时修改文字颜色

随机推荐

  1. android java js 回调 真心好用
  2. 第四章-View的工作原理(MeasureSpec、Lay
  3. Hello, Android(安卓)Studio!
  4. Android(安卓)数据存储 之 SQLite数据库
  5. Android(安卓)自定义AlertDialog 去黑边
  6. android写入联系人Contacts的信息,包括联
  7. Android(安卓)解决WebView调用loadData()
  8. Android(安卓)Vibrator 框架总结
  9. Android消息机制——时钟显示和异步处理
  10. 关于Handler.removemessages方法