• Android--Dialog


    前言

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

    Dialog

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

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

    • AlertDialog:警告对话框,使用最广泛功能最丰富的一个对话框。
    • ProgressDialog:进度条对话框,只是对进度条进行了简单的封装。
    • DatePickerDialog:日期对话框。
    • TimePickerDialog:时间对话框。

      所有的对话框,都是直接或间接继承自Dialog类,而AlertDialog直接继承自Dialog,其他的几个类均继承自AlertDialog。

    AlertDialog

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

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

    • AlertDialog create():根据设置的属性,创建一个AlertDialog。
    • AlertDialog show():根据设置的属性,创建一个AlertDialog,并且显示在屏幕上。
    • AlertDialog.Builder setTitle():设置标题。
    • AlertDialog.Builder setIcon():设置标题的图标。
    • AlertDialog.Builder setMessage():设置标题的内容。
    • AlertDialog.Builder setCancelable():设置是否模态,一般设置为false,表示模态,要求用户必须采取行动才能继续进行剩下的操作。

      Tips:AlertDialog.Builder的很多设置属性的方法,返回的均是这个AlertDialog.Builder对象,所以可以使用链式方式编写代码,这样更方便。

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

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

      示例:

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

       展示效果:

    AlertDialog的按钮

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

    • AlertDialog.Builder setPositiveButton(CharSquence text , DialogInterFace.OnClickListener):一个积极的按钮,一般用于“OK”或者“继续”等操作。
    • AlertDialog.Builder setNegativeButton(CharSquence text , DialogInterFace.OnClickListener):一个负面的按钮,一般用于“取消”操作。
    • AlertDialog.Builder setNeutralButton(CharSquence text , DialogInterFace.OnClickListener):一个比较中性的按钮,一般用于“忽略”、“以后提醒我”等操作。

      上面介绍的DialogInterface接口,还提供了一系列的事件响应,这三个按钮均需要传递一个DialogInterFace.OnClickListener接口对象,实现其点击事件的触发,在这个接口中需要实现一个onClick(DialogInterface dialog,int which),dialog为当前触发事件的对话框对象接口,可以直接强制转换为AlertDialog进行操作;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         });
    复制代码

      展示效果:

    AlertDialog的列表形式

      AlertDialog除了展示一些提示信息,还可以展示一种列表的形式,需要使用到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         });
    复制代码

      效果展示: 

     AlertDialog的单选列表

      AlertDialog还可以使用一种单选的列表样式,使用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         });
    复制代码

      效果展示:

    AlertDialog多选列表

      AlertDialog除了单选列表,还有多选的列表。可以使用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的简单例子,有兴趣的可以下载下来看看。

     

  • 相关阅读:
    读《阿里云是如何失控的》有感
    LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找
    界面编程模仿篇(QQ登录界面逼真篇)
    最牛B的编码套路
    QinQ封装及终结详解
    seaJs学习笔记之javascript的依赖问题
    Deploy maven on Linux OS
    c++——inline内联函数
    c++——引用
    c++——const关键字
  • 原文地址:https://www.cnblogs.com/plokmju/p/android_dialog.html
Copyright © 2020-2023  润新知