`
cavalry800528
  • 浏览: 52970 次
文章分类
社区版块
存档分类
最新评论

Android

 
阅读更多

前言

对话框对于应用也是必不可少的一个组件,在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         });
复制代码

展示效果:

 

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         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中的下标。

示例:

复制代码
 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         });
复制代码

效果展示:

  源码下载

 总结

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

请支持原创,尊重原创,转载请注明出处。谢谢。

2
4
分享到:
评论

相关推荐

    android 经典代码例子

    在Android开发领域,经典代码例子是开发者学习和提升技能的重要资源。这些例子涵盖了各种关键功能和组件的实现,有助于深入理解Android应用的工作原理。在这个压缩包中,我们可能找到了多个有关Android编程的示例...

    Android开发入门60个小案例+源代码

    在Android开发领域,初学者经常会面临许多挑战,如理解Android应用程序的基本架构、学习XML布局、掌握Java或Kotlin编程语言,以及如何与设备硬件交互等。"Android开发入门60个小案例+源代码"这个资源提供了丰富的...

    Android省市区三级联动滚轮选择——Cascade_Master

    该组件是基于开源库`Android-wheel`实现的,`Android-wheel`是一个适用于Android的滚轮选择器,它可以创建类似于iOS中PickerView的效果,让用户通过滚动来选取所需的数据。在省市区三级联动中,当用户在一级(省)...

    Android自定义日期选择器源码

    在Android开发中,系统默认的日期和时间选择器虽然实用,但往往无法满足所有场景的需求。因此,开发者经常需要自定义日期选择器来提供更符合应用风格或特定功能的交互体验。这篇内容将深入探讨如何在Android中创建一...

    Android通过webservice连接Sqlserver实例

    在Android开发中,有时我们需要与远程数据库进行交互,例如SQLServer。这个场景通常是通过Web服务,如WebService来实现。本文将详细介绍如何在Android应用中利用WebService接口连接到SQLServer数据库,实现数据的增...

    Android串口通信(Android Studio)

    在Android开发中,串口通信(Serial Port Communication)是一种重要的技术,它允许设备之间通过串行接口进行数据交换。在Android Studio环境下实现串口通信,开发者可以构建与硬件设备交互的应用,例如读取传感器...

    Android组件设计思想

    Android应用开发的哲学是把一切都看作是组件。把应用程序组件化的好处是降低模块间的耦合性,同时提高模块的复用性。Android的组件设计思想与传统的组件设计思想最大的区别在于,前者不依赖于进程。也就是说,进程...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android 完美实现图片圆角和圆形

    在Android开发中,有时我们需要对显示的图片进行特殊处理,比如让图片呈现圆角或完全圆形。本知识点将深入探讨如何在Android应用中完美实现图片的圆角和圆形效果。 首先,我们来看如何实现图片的圆角效果。Android...

    Android.bp文件说明.pdf

    Android新编译规则Android.bp文件语法规则详细介绍,条件编译的配置案例。 Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk 文件的。在 Android7.0 以前,Android 都是使用 ...

    JS调用Android方法,向Android方法传递json数据

    在现代的移动应用开发中,JavaScript与原生平台之间的交互变得越来越常见,特别是在使用Android的WebView组件时。本文将深入探讨如何使用JavaScript调用Android的方法,并传递JSON数据,以实现两者之间的高效通信。 ...

    Android扫雷游戏(基于Android Studio)

    【Android扫雷游戏开发详解】 在移动开发领域,Android Studio是Google推出的官方集成开发环境(IDE),用于构建Android应用程序。本项目"Android扫雷游戏"就是利用Android Studio进行开发的一个实例,旨在帮助初学...

    android应用开发范例精解

    第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...

    android 仿微信语音聊天demo

    【Android 微信语音聊天Demo】是一个典型的移动应用开发示例,主要展示了如何在Android平台上构建类似微信的语音聊天功能。这个Demo包含了按钮状态切换、语音录制、本地存储、回放和加载等一系列关键操作,是Android...

    Android SDK离线包合集(Android 4.0-5.0)

    Android SDK离线包合集(Android 4.0-5.0)。不用去Google下载,直接国内下载离线包,各版本文件独立,任意下载。手机流量上传了一部分,好心疼。如不能下载,请告诉我更新地址。 附上简单教程。 这是Android开发所...

    Android 图片浏览全屏缩放

    在Android开发中,实现图片浏览的全屏缩放效果是一项常见的需求,特别是在社交应用中,如QQ好友动态和微信朋友圈。这种功能不仅需要提供良好的用户体验,还需要考虑性能和内存优化,因为图片通常较大,处理不当可能...

    Android小项目集合100多个

    1. **Android SDK**:Android软件开发工具包(SDK)是开发Android应用的基础,包含了开发、调试和发布应用所需的所有工具,如Android Studio IDE、Java Development Kit(JDK)、模拟器以及各种版本的Android平台库...

    Android基于Socket聊天最终版

    在本项目中,“Android基于Socket聊天最终版”是一个实现了基于Socket通信的简易聊天应用,它模仿了QQ的一些功能。这个项目包含三个主要部分:服务器端、客户端和数据库管理。通过Socket编程,Android设备可以作为...

Global site tag (gtag.js) - Google Analytics