Dialogs(对话框)

Posted yh_android_blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dialogs(对话框)相关的知识,希望对你有一定的参考价值。

概述

对话框是一个小的窗口用以提示用户做出决定或输入额外的信息。对话框不会填满屏幕并且通常被用作模态事件,要求用户做出行动才能继续下去。 对话框设计:关于如何设计你的对话框,包括一些建议,请阅读   Dialogs  设计向导。 Dialog类是对话框的基类,你应该避免直接实例化 Dialog。改为使用如下的一个子类:
AlertDialog
一个可以展示 标题,三个按钮,可选择项的列表或自定义布局 的对话框。
DatePickerDialog or  TimePickerDialog
一个使用预先定义好的UI,允许用户选择一个日期或时间 的对话框
避免使用ProgressDialog               安卓包含了一个名为 ProgressDialog的对话框,它可以展示一个带有进度条的对话框。然而,如果你需要指出加载状态或不确定的进度信息,你应该遵循   Progress & Activity  的设计指导,并且在你的布局中使用 ProgressBar
这些类为你的对话框定义了样式和结构,但是你应 为你的对话框 该使用 DialogFragment作为容器。 DialogFragment类提供你需要创建你的对话框的所有控制并且管理它的显示,替代在 Dialog对象中调用方法。 使用 DialogFragment管理对话框,来确保正确的处理生命周期事件,如当用户按下返回按钮或旋转屏幕。 DialogFragment类允许你重用该对话框的UI在大的UI中作为可嵌入的组件,就像传统的fragment一样(如在大屏幕和小屏幕上显示不同的对话框UI)。 这篇文章接下来的章节描述了如何结合一个 AlertDialog  对象来使用 DialogFragment。如果你想创建一个日期或时间选择器,你应该去阅读 Pickers(选择器):因为该 DialogFragment类在安卓3.0才加入进来,该文章描述的如何使用 DialogFragment类是由   Support Library提供的。在你的应用中加入该库,你可以使用 DialogFragment并且各类可在安卓1.6或更高版本上运行的API。如果你的应用支撑的最低版本是API 11或更高,你可以在使用框架版本的 DialogFragment,但是要注意在该文件中的关于支持库API的链接。当使用了支持库,确保你import的是 android.support.v4.app.DialogFragment 而不是 android.app.DialogFragment .。

创建对话框碎片(Dialog Fragment)

你可以实现一个广义上的对话框设计——包括自定义布局和在 Dialogs设计向导中的描述——通过继承 DialogFragment并且在 onCreateDialog()回调函数中 创建一个 AlertDialog。 例如,这里有个基本的 AlertDialog 通过 DialogFragment :管理的:
   
    
     public class FireMissilesDialogFragment extends DialogFragment 
    
    
         @Override
    
    
         public Dialog onCreateDialog(Bundle savedInstanceState) 
    
    
             // Use the Builder class for convenient dialog construction
    
    
             AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    
    
             builder.setMessage(R.string.dialog_fire_missiles)
    
    
                    .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() 
    
    
                        public void onClick(DialogInterface dialog, int id) 
    
    
                            // FIRE ZE MISSILES!
    
    
                        
    
    
                    )
    
    
                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() 
    
    
                        public void onClick(DialogInterface dialog, int id) 
    
    
                            // User cancelled the dialog
    
    
                        
    
    
                    );
    
    
             // Create the AlertDialog object and return it
    
    
             return builder.create();
    
    
         
    
    
     
    
   

现在,当你创建了一个该类的引用并且在该对象中调用了 show(),该对话框便会显示出来,如图1. 下面的章节描述了更多关于使用 AlertDialog.BuilderAPI来创建对话框的方法。 取决于如何组合你的对话框,你可以实现 DialogFragment中的各种回调方法,包括所有基于fragment生命周期的方法。

创建警告对话框(Alert Dialog)


AlertDialog类允许你创建和设计各种各样的对话框,并且总有一个对话框是你需要的。如图2所示,alert dialog上有三个区域:
1.标题     这是一个可选项并且仅当内容被详细消息,一个列表或自定义布局占用时使用。如果你希望说明一个简单的消息或问题(例如图1的对话框),则不需要标题。
2. 内容区域     这里可以展示消息,列表或其它自定义不布局
3.操作按钮     在一个对话框中不超过个三个操作按钮
AlertDialog.Builder类提供API来让你创建一个 AlertDialog和这些内容,包括自定义布局。
为创建一个 AlertDialog ::
   
    
     // 1. 通过它的构造器实例化一个 AlertDialog.Builder
    
    
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    
    
      
    
    
     // 2.将设置方法都集合在一起来设置对话框的属性
    
    
     builder.setMessage(R.string.dialog_message)
    
    
            .setTitle(R.string.dialog_title);
    
    
      
    
    
     // 3.  从create()中获得
     AlertDialog
    
    
     AlertDialog dialog = builder.create();
    
   
接下来的话题展示了如何定义不同的属性,通过使用 AlertDialog.Builder类。

添加按钮

添加按钮变为图2所示,调用   setPositiveButton()  和 setNegativeButton()方法 :
  
   
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
   
   
    // Add the buttons
   
   
    builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() 
   
   
               public void onClick(DialogInterface dialog, int id) 
   
   
                   // User clicked OK button
   
   
               
   
   
           );
   
   
    builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() 
   
   
               public void onClick(DialogInterface dialog, int id) 
   
   
                   // User cancelled the dialog
   
   
               
   
   
           );
   
   
    // Set other dialog properties
   
   
    ...
   
   
     
   
   
    // Create the AlertDialog
   
   
    AlertDialog dialog = builder.create();
   
  
set...Button()  methods  方法请求一个按钮的标题(由string资源文件提供)和一个 DialogInterface.OnClickListener  ,该监听器定义了当用户点击该按钮时的操作。
这里有三种不同的操作按钮可以添加:   Positive 
         你可以使用它来执行同样和继续操作("OK'按钮)
Negative          你可以使用它来执行取消操作
Neutral          你应该在用户可能不希望继续操作时使用这个,但并不是一定要取消。它显示在postive和negative按钮之间。例如,该操作获取是“之后再提醒我”
这三种操作按钮可以都添加一个在 AlertDialog .中。也就是说,不能有多个“positive”按钮。

添加列表


AlertDialogAPI中有三种类型的列表可用:
  • 一个传统的单选列表
  • 一个持续的单选列表(单选按钮)
  • 一个持续的多选列表(复选框)
  • //持续的说明可以保存选项
像图3一样创建衣服单选列表,使用 setItems()方法:
   
    
     @Override
    
    
     public Dialog onCreateDialog(Bundle savedInstanceState) 
    
    
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    
    
         builder.setTitle(R.string.pick_color)
    
    
                .setItems(R.array.colors_array, new DialogInterface.OnClickListener() 
    
    
                    public void onClick(DialogInterface dialog, int which) 
    
    
                    // which 变量包含了被选中项的索引值
    
    
                
    
    
         );
    
    
         return builder.create();
    
    
     
    
   
因为列表是显示在对话框的文本区,对话框无法同时显示一个消息和列表,并且你应该为对话框设置标题,通过 setTitle()。为列表指定列表项,调用 setItems(),传递一个数组。或者,你可以使用 setAdapter() 指定一个列表。使用 ListAdapter 允许你用 动态数据(例如数据库中的数据)返回列表。 如果你选择用 ListAdapter ,返回你的列表,经常使用一个 Loader来异步加载内容。这些在 Building Layouts with an Adapter  和   Loaders开发向导中详细的讲解了。 :默认的,触摸一个列表项将会消失该对话框,除非你使用一个持久的选择列表。

添加一个持久的复选/单选列表


为了添加一个持续的复选项(checkbox)或单选项(radio button),分别使用 setMultiChoiceItems()  或 setSingleChoiceItems()  方法。 例如,这里展示了如何创建一个像图4一样的复选列表,并且存储了被选中项在 ArrayList :中:
   
    
     @Override
    
    
     public Dialog onCreateDialog(Bundle savedInstanceState) 
    
    
         mSelectedItems = new ArrayList();  //跟踪被选项的地方
    
    
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    
    
         // 设置对话框标题
    
    
         builder.setTitle(R.string.pick_toppings)
    
    
         // 指定列表数组, 默认被选中项t (null for none),和选择项目时的监听器
    
    
                .setMultiChoiceItems(R.array.toppings, null,
    
    
                           new DialogInterface.OnMultiChoiceClickListener() 
    
    
                    @Override
    
    
                    public void onClick(DialogInterface dialog, int which,
    
    
                            boolean isChecked) 
    
    
                        if (isChecked) 
    
    
                            // 如果用户选中了项目,将它加入被选择项
    
    
                            mSelectedItems.add(which);
    
    
                         else if (mSelectedItems.contains(which)) 
    
    
                            // 否则,如果项目已经在数组中,移除它
    
    
                            mSelectedItems.remove(Integer.valueOf(以上是关于Dialogs(对话框)的主要内容,如果未能解决你的问题,请参考以下文章

Dialogs(对话框)

Delphi XE5 Android Dialogs 对话框(模拟做了一套)

UI5-文档-4.19-Reuse Dialogs

如何实现:编写vba 弹出文件对话框,并打开选中文件?

使用 MVVM 在 wpf 中使用 Dialogs 的好做法还是坏做法?

【译】Android材质组件的动手实践:Dialogs