AlertDialog具体解释

   对话框介绍与演示样例

        对话框在程序中不是必备的,可是用好对话框能对我们编写的应用增色不少。採用对话框能够大大添加应用的友好性。比較经常使用的背景是:用户登陆、网络正在下载、下载成功或者失败的提示,还有,比方:短信来了、电池没电了等等,仅仅要你想到的,能提高用户体验的,你都能够使用对话框。

首先,请大家找到文档,在右上角的搜索框中输入Dialog,依据提示,选择app.dialog。大家能够先阅读一下英文文档,大体先看看,继承于哪个类,有哪些子类等等,这对于知识的积累相当重要。不是非常难,假设你认为读不懂,能够借助有道词典。我一直认为,假设没有中国这么庞大的市场,Android不可能发展这么快,但是他们为什么就不出中文文档呢,反而出日语的文档,想不通。强烈建议他们尽快出中文的文档。

什么是Dialog
Dialog类,是一切对话框的基类,须要注意的是,Dialog类尽管能够在界面上显示,可是并不是继承于View类,而是直接从java.lang.Object開始构造出的。类似于Activity,Dialog也是有生命周期的,它的生命周期由Activity来维护。Activity负责生成、保存、恢复它。在生命周期的每个阶段都有一些回调函数供系统反向调用。
ShowDialog(int id):负责显示标示为id的Dialog,这个函数假设调用后,系统将反向调用Dialog的回调函数onCreateDialog(int id);
dismissDialog(int id):使标示为id的Dialog在界面其中消。

Dialog有两个比較常见的回调函数,onCreateDialog(int id)和onPrepareDialog(int id,Dialog dialog)。假设Activity调用了showDialog(int id)后,假设这个Dialog是第一次生成,系统将反向调用Dialog的回调函数onCreateDialog(int id),再调用onPrepareDialog(int id ,Dialog dialog),假设这个Dialog还没有生成,仅仅只是还没有显示出来,那么将不会回调onCreateDialog(int id),而是直接回调onPrepareDialog(int id,Dialog dialog)方法。onPrepareDialog(int id,Dialog dialog)方法提供了这样一套机制,当Dialog生成可是没有显示出来的时候,使得有机会在显示前对Dialog做一些改动,如对Dialog标题进行改动。

什么是AlertDialog?什么是AlertDialog.Builder?
        AlertDialog是Dialog的一个直接子类,一个AlertDialog能够有两个Button或者3个Button,能够对一个AlertDialog设置title、message。不能直接通过AlertDialog的构造函数来生成一个AlertDialog,一般生成的时候都是通过它的的一个内部静态类AlertDialog.Builder来构造的。


以下才是我写这篇文章的用意,在对话框中实现自己定义视图,来提升用户体验。

给Dialog设置个性化的View(我翻译为视图)
        系统中提供的太死板了,我们总是会有非常多新鲜的想法,那么怎样实现给一个Dialog自己定义一个布局呢?我们要用到LayoutInFlater,通过这个类的inflate方法,能够将一个XML的布局变成一个View实例。这样的使用方法,我们会经经常使用到,所以务必学会。然后,我们通过builder.setView(myownview)这个语句,就能够将个性化的视图放到Dialog里边去。当然,你能够传入不论什么的视图对象,比方图片框,WebView等,尽情发挥你的想象力吧。

进度条Dialog:ProgressDialog
        顾名思义,这个Dialog负责给用户显示运行进度的相关情况,它是AlertDialog的一个子类,在我的演示样例代码中,我是实现默认的进度显示。当然能够配置自己的进度条。同一时候有一点,提醒大家要注意,ProgressDialog不须要Builder这个内部静态类进行构造,而是直接使用构造函数进行构造。

事实上在android其中还提供了非常多Dialog,如CharacterPickerDialog/TimePickerDialog/DatePickerDialog等,可是都不是非经常常使用。用到的,大家就自己去查把,我临时还用不到,因此就不给大家演示样例代码了,由于我时间也非常紧,做測试的话,非常费时间。假设有朋友測试了,或者正好手中有这种列子,能够回复我下,我加进来,以便其他的朋友查看,学习。

        上面把Dialog的基础都说了说,说实话,懂这些还不够,远远不够,等真正开发应用的时候,假设你用了这些,就会发现你做出的应用非常难看,或者不适用。因此,做些变通还是非常必要的。

以下的图片是第一个演示样例程序的代码:有6个截图:(演示样例代码名称:AlertDialogTest1.rar)


  注意: 假设你希望在onCreateDialog()方法之外创建对话框, 它将不会依附在Activity上. 你能够使用setOwnerActivity(Activity)来将它依附在Activity上.
  当你希望显示一个对话框时, 调用showDialog(int)并将对话框的id传给它.
  当一个对话框第一次被请求时,Android调用onCreateDialog(int). 这里是你初始化对话框的地方. 这个回调函数传入的id和showDialog(int)同样. 创建对话框之后,将返回被创建的对象.
  在对话框被显示之前,Android还会调用onPrepareDialog(int, Dialog). 假设你希望每次显示对话框时有动态更改的内容, 那么就改写这个函数. 该函数在每次一个对话框打开时都调用. 假设你不定义该函数,则对话框每次打开都是一样的. 该函数也会传入对话框的id以及你在onCreateDialog()中创建的Dialog对象.
  最好的定义onCreateDialog(int) 和onPrepareDialog(int, Dialog) 的方法就是使用一个switch语句来检查传入的id. 每一个case创建对应的对话框. 比如, 一个游戏使用两个对话框: 一个来指示游戏暂停,还有一个指示游戏结束. 首先, 为它们定义ID:static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1; 
然后, 在onCreateDialog(int)中增加一个switch语句:
protected Dialog onCreateDialog(int id) {
    Dialog dialog;
    switch(id) {
    case DIALOG_PAUSED_ID:
        // do the work to define the pause Dialog
        break;
    case DIALOG_GAMEOVER_ID:
        // do the work to define the game over Dialog
        break;
    default:
        dialog = null;
    }
    return dialog;

  注意: 在这个样例中, case语句为空由于定义Dialog的程序在后面会有介绍.
  在须要显示对话框是, 调用showDialog(int), 传入对话框的id:
  showDialog(DIALOG_PAUSED_ID);Dismissing a Dialog 解除对话框
  当你准备关闭对话框时, 你能够使用dismiss()函数. 假设须要的话, 你也能够从Activity调用dismissDialog(int), 二者效果是一样的.
  假设你使用onCreateDialog(int)来管理你的对话框的状态, 那么每次你的对话框被解除时, 该对话框对象的状态会被Activity保存. 假设你决定你不再须要这个对象或者须要清除对话框的状态, 那么你应该调用 removeDialog(int). 这将把全部该对象的内部引用移除, 假设该对话框在显示的话将被解除.
  Using dismiss listeners 使用解除监听器
  假设你希望在对话框解除时执行某些程序, 那么你应该给对话框附加一个解除监听器.
  首先定义DialogInterface.OnDismissListener接口. 这个接口仅仅有一个方法, onDismiss(DialogInterface), 该方法将在对话框解除时被调用.
  然后将你的OnDismissListener实现传给setOnDismissListener().
  然而,注意对话框也能够被"取消". 这是一个特殊的情形, 它意味着对话框被用户显式的取消掉. 这将在用户按下"back"键时, 或者对话框显式的调用cancel()(按下对话框的cancelbutton)时发生. 当一个对话框被取消时, OnDismissListener将仍然被通知, 但假设你希望在对话框被显示取消(而不是正常解除)时被通知, 则你应该使用setOnCancelListener()注冊一个DialogInterface.OnCancelListener.
  Creating an AlertDialog 创建警告对话框
  An AlertDialog is an extension of the Dialog class. It is capable of constructing most dialog user interfaces and is the suggested dialog type. You should use it for dialogs that use any of the following features:
  一个警告对话框是对话框的一个扩展. 它可以创建大多数对话框用户界面而且是推荐的对话框类新星. 对于须要下列不论什么特性的对话框,你都应该使用它:
  一个标题
  一条文字消息
  1个-3个button
  一个可选择的列表(单选框或者复选框)
  要创建一个AlertDialog, 使用AlertDialog.Builder子类. 使用AlertDialog.Builder(Context)来得到一个Builder, 然后使用该类的公有方法来定义AlertDialog的属性. 设定好以后, 使用create()方法来获得AlertDialog对象.
  以下的主题展示了怎样为AlertDialog定义不同的属性, 使用AlertDialog.Builder类. 假设你使用这些演示样例代码, 你能够在onCreateDialog()中返回最后的Dialog对象来获得图片中对话框的效果.
  Adding buttons 添加按钮
  要展开一个xml布局,使用 getLayoutInflater() (或 getSystemService())取得LayoutInflater,然后调用inflate(int, ViewGroup),第一个參数为布局id,而第二个參数为根view的id。如今,你能够使用展开后的布局来找到View对象并定义 ImageView和TextView元素的内容。然后实例化AlertDialog.Builder并使用setView(View)来为对话框设置展开后的布局。比如:
AlertDialog.Builder builder;
AlertDialog alertDialog; 
Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
                               (ViewGroup) findViewById(R.id.layout_root));
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);
builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();
使用AlertDialog来自己定义对话框,能够利用其内置特性比如button、选择列表、标题、图标等。