前言

  对话框对于应用也是必不可少的一个组件,在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是如何提示信息的:

  示例:

btnGeneral.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setTitle("提示");builder.setMessage("这是一个普通的对话框!");builder.setIcon(R.drawable.ic_launcher);builder.setCancelable(false);builder.setPositiveButton("知道了!", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.cancel();}});builder.create().show();}});

展示效果:

<ignore_js_op> 
AlterDialog的按钮

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

btnButtons.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setTitle("提示");builder.setMessage("这是一个多按钮普通的对话框!");builder.setIcon(R.drawable.ic_launcher);builder.setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {                        Toast.makeText(MainActivity.this, "确定被点击",Toast.LENGTH_SHORT).show();dialog.dismiss();}});builder.setNegativeButton("否定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "否定被点击",Toast.LENGTH_SHORT).show();dialog.dismiss();}});builder.setNeutralButton("忽略", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "忽略被点击",Toast.LENGTH_SHORT).show();dialog.cancel();}});builder.show();}});

展示效果:

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:当对话框使用多选列表,并且选中的时候触发。
  示例:

btnListView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setTitle("请选择城市");//items使用全局的finalCharSequenece数组声明builder.setItems(items, new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubString select_item = items[which].toString();Toast.makeText(MainActivity.this,"选择了---》" + select_item, Toast.LENGTH_SHORT).show();}});builder.show();}});

效果展示: 

AlterDialog的单选列表

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

  示例:

btnListViewSingle.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setTitle("请选择一下城市");builder.setSingleChoiceItems(items, 1, new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubString select_item = items[which].toString();Toast.makeText(MainActivity.this,"选择了--->>" + select_item, Toast.LENGTH_SHORT).show();}});builder.setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.show();}});

效果展示:

AlterDialog多选列表

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

  示例:

btnListViewMulti.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setTitle("请选择城市");builder.setMultiChoiceItems(items, new boolean[] { true, false,true }, new OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which,boolean isChecked) {// TODO Auto-generated method stubString select_item = items[which].toString();Toast.makeText(MainActivity.this,"选择了--->>" + select_item, Toast.LENGTH_SHORT).show();}});builder.setPositiveButton("确定", new OnClickListener() {@Overridepublic 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()即可。

  布局代码:

<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" ><Buttonandroid:id="@+id/btnGeneral"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="普通对话框" /><Buttonandroid:id="@+id/btnButtons"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="多按钮的普通对话框" /><Buttonandroid:id="@+id/btnListView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="列表选择对话框" /><Buttonandroid:id="@+id/btnListViewSingle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="单选列表选择对话框" /><Buttonandroid:id="@+id/btnListViewMulti"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="多选列表选择对话框" /><Buttonandroid:id="@+id/btnProgressDialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="滚动等待对话框" /><Buttonandroid:id="@+id/btnProgressDialogH"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="进度条对话框" /><Buttonandroid:id="@+id/btnCustomDialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="自定义对话框" />
</LinearLayout>

实现代码:

btnCustomDialog.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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();                }});

效果展示:

ProgressDialog

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

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

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

  示例:

btnProgressDialog.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void run() {try {Thread.sleep(5000);            } catch (Exception e) {e.printStackTrace();}finally{progressDialog.dismiss();}                        }}).start();}});

效果展示:

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

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

btnProgressDialog.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void run() {try {Thread.sleep(5000);            } catch (Exception e) {e.printStackTrace();}finally{progressDialog.dismiss();}                        }}).start();}});

转载于:https://www.cnblogs.com/niray/p/3774479.html

【Android】Android--Dialog相关推荐

  1. 【转载】Android提醒微技巧,你真的了解Dialog、Toast和Snackbar吗?

    [转载]Android提醒微技巧,你真的了解Dialog.Toast和Snackbar吗? 转载请注明出处:http://blog.csdn.net/guolin_blog/article/detai ...

  2. 【转】Android 自己收集的开源项目和文章集合(持续更新至2018.12.17)

    2017-12-21 1.炫酷开屏动画框架 https://github.com/JoshuaRogue/FancyView 2.防京东,支付宝密码键盘和密码输入框 https://github.co ...

  3. 【NFC】Android NFC API Reference中英文

    SkySeraph 博客园 首页 新随笔 联系 订阅 管理 随笔- 192  文章- 0  评论- 441  [NFC]Android NFC API Reference中英文 [NFC]Androi ...

  4. 【朝花夕拾】Android性能篇之(二)Java内存分配

    前言       原文:[朝花夕拾]Android性能篇之(二)Java内存分配        在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给 ...

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

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

  6. 【Android】Android 设置Activity窗体 不显示标题和全屏显示

    [一]Android 设置Activity窗体 不显示标题 android:theme="@android:style/Theme.NoTitleBar" 1 <activi ...

  7. 【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  8. 【分享】Android JNI实例​

    [分享]Android JNI实例​ Android的SDK中没有包括JNI的支持,而且对如何支持JNI也没有任何文档说明.不过既然整个Android平台是开源的,我们可以通过Google发布的源代码 ...

  9. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发机制...

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  10. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

最新文章

  1. 搭建WSS 开发测试环境
  2. AIX存储管理(二)物理卷管理
  3. java.util.timer 定时任务_java.util系列源码解读之Timer定时器
  4. 8.2、磁盘、目录和文件计算
  5. mysql数据库基操,都坐下!
  6. MongoDB学习(黑马教程)-5-数据库MongoDB的验证
  7. 三次样条插值的缺点_三次样条插值
  8. phpstudy配置sg11
  9. Photoshop处理风景照为非主流色调签名
  10. JS逆向寻找生成bid变量的加密算法,一顿操作猛如虎,结果发现原来是混淆代码
  11. 【小程序专栏】个人及企业资质该如何注册小程序?
  12. android应用虚拟内存耗尽,GuardMalloc导致虚拟内存耗尽
  13. linux 定时开关机
  14. 第一章 TCP/IP 协议
  15. cocos creator学习(十四) websocket、onfire
  16. BS酒店管理系统的设计与实现论文+任务书+中期检查+设计源码+答辩PPT
  17. appstore 截图及视频尺寸要求
  18. 计算机网络的核心技术,计算机网络技术的核心技术领域应用分析
  19. 394计算机毕业设计
  20. C++服务编译耗时优化原理及实践

热门文章

  1. 【POJ2826】An Easy Problem?!(线段相交+分情况讨论+精度)
  2. 【PATL2-002】链表去重(链表模拟)---水题
  3. 重庆邮电大学c语言实验报告,重庆邮电大学c语言上机实验期末实验报告.doc
  4. pandas将字符串转换成时间_数据处理利器 pandas 实例详解 (下)
  5. PyTorch搭建AlexNet模型(在CIFAR10数据集上准确率达到了85%)
  6. java 简易扫雷_JAVA基础课程设计 简易扫雷
  7. k8s和mysql怎么通信_k8s中的网络通信总结
  8. 计算机检索系统中 每一种文献特征,自考《档案文献检索》串讲资料(1)
  9. 2021-09-01175. 组合两个表 SQL
  10. 解决办法!!!!UnsatisfiedLinkError: Failed to find the required library mclmcrrt9_0.dll on java.library.