Android中Dialog

在Android中,Dialog是一个非常重要的UI, 它可以方便的给用户提示,用最简洁的方式向用户展示信息, 以下的图片是Dialog的一个整体架构,通过它,可以总体对Dialog有一个很清晰的认识.

从这张图中可以看到,Dialog为父类, 其下有最重要的, 我们最常用的AlertDilog, 而AlertDialog的子类,则是由DatPicker, ProgressDialog,TimePick来组成. 
这几个子类都是我们在程序开发中最常用的,因此要重点理解, 我们可以试着想像一下,如下几个问题的答案 
<1> 怎么产生一个Dialog? 
<2> Dialog与Activity是什么关系? 为什么显示Dialog的时候,Activity就失去了焦点,不能被点击,在系统内部到底是怎么管理他们的关系的?

我们以ProgressDialog为例, 通过分析其源码,让我们彻底理解它的内部运行机制

<1> 怎么产生一个ProgressDialog? 
    通过打开ProgressDialog的源码, 可以看到它有2个构造方法, 
    
     ProgressDialog(Context context)

ProgressDialog(Context context,int theme)

参数解释: context:说明它是依靠Context,必须通过一个Context来创建它, 第二个参数theme: 此dialog的主题.

另外我们还可以发现  有四个静态的show方法,他们只是参数不同,

show(Context context,CharSequence title,CharSequence message);

show(Context context,CharSequence title,CharSequence message,boolean indeterminate);

其时,我们只看最后一个静态方法就行了,因为三个静态方法,最终会调用最后一个参数最多的show静态方法来完成功能.

它所实现的功能是: 
     ProgressDialog dialog=new ProgressDiaog(context); 
     ... 
     ... 
     ... 
     dialog.show();

这其实跟,我们调用构造方法是一样的.

到这一步,仅仅是知道了,怎么调用产生的ProgressDialog的,但具体内部的细节呢。还要看onCreate()方法, 此方法才是真正能产生progressDialogr 地方, 它跟Activity中的onCreate()方法是一样的,就是初始化的时候调用, 我们看其源码如下:

首先看到的是一个名叫 mViewUpdatehandler的 Handler, 这个Handler主要用来更新progress的值, (百分比),接着往下看... 
有这么一句: View view=inflater.inflate(R.layout.alert_dialog_press,null); 
很明显,这就是我们看到的,显示在dialog中转圈的那个东东. 然而,这个alert_dialog_pross文件是在com.android.internal.R 包中,属于系统定义的ui配置文件.

最后调用 setView(view)方法来, 来把view显示在Dialog上。

因此,我们同样也可以实现自定义一个dialog.xml文件,来调用setView()方法显示上来.

这个setView()方法是AlertDialog类中定义的,等会再解释!

这就是我们平时所见到的 ProgressDialog。分析完毕。

AlertDialog

接下来,我们开始分析ProgressDialog的父类  AlertDialog.

打开源码,首先映入眼帘的是 三个构造方法,但这三个构造方法都是protected类型的, 
可见,不允许我们直接实例化AlertDialog. 因此,我们再看别的有没有方法.可以实例化

再仔细一看,发现一个变量 ,

AlertController mAlert; 这个才是我们今天的主角,重点研究它.

mAlert的定义是在 ,以上我们提到的AlertDialog的构造函数,

此外,我们还发现,AlertDialog中几乎所有的方法都是通过这个mAlert变量来操作的,

也就是说,AlertDialog是一个空壳,并没有实际的作用, 它的实质是AlertController类. 
就是我刚才说的  "主角" 。 而Alertcontroller的源码,是Android系统自带的,我们需要花费一番力气去查找.

在往下看,AlertDialog 类中,发现一个静态类 Builder,  通过这个类,我们也可以直接创建一个Dialog, 
Builder静态类中也同样有一个AlertController.Alertparams的类的对象 P,我们再看Builder的源码,它里面可以设置所有Dialog的的方法,包括 
setTitle(CharSequence title) 
setMessage(int messageId); 
setIcon(int iconId); 
setPositiveButton() 
  ... 
  ... 
  ....

等,我们看这些方法的的内部实现,全部是针对它的内置对象P 来实现的, 也就是我们所调用的这些方法,最终结果实际上是用在了AlertController.AlertParams 类的对象P 身上,

,而别外还有一个有趣的现象,这些方法的返回值都是Builder对象, 也就是说,我们可以连级调用此方法,

而显示一个Dialog,仅仅调用这些set 方法,还不够,最后还差一步, 就是调用create()方法,这个方法是最后调用的,也就是创建对话框, 我们看,create方法中都做了那些动作

public AlertDialog create() { 
   final AlertDialog dialog =new AlertDialog(p.mContext); 
   p.apply(dialog.mAlert) 
   dialog.setCancelable(P.mCancelable); 
   
   return dialog; 
}

这个是create()的实现,我们可以很直观地看出是它帮我们创建了一个AlertDialog对象, 
这里的p, 就是我们创建的AlertController.Alertparams的对象, 
而在AlertDialog  dialog=new AlertDialog(p.mContext); 这句代码中,定义Dialog的同时也定义了 一个AlertController 的对象 mAlert;

在第二句代码中,p.apply(dialog.mAlert) ,我们跟踪过去,看下,哈哈,原来是,我们刚才调用的set方法的值,又还原给新定义的dialog中的  mAlert对象了,  这下明白了,原来 P只不过是一个 "屁"   ,暂时的存放数据的对象,只要我们调用create方法,P就会乖乖的把数据交给dialog对象,

除了create方法以外, 还有一个show() 方法,实现如下

public AlertDialog show() { 
    AlertDialog dialog=create(); 
    dialog.show(); 
    return dialog;

}

我们可以看出,show() 也是调用的 create方法. 
由以下的分析,我们就可能轻松理解,如下我们常用的语句了,

return new AlertDialog.Builder(context). 
            setIcon(R.drawable.alert_icon). 
            setTitle(R.string.alert_str) 
            .create() ;

这是我们平时用到的产生Dialog

时间: 2024-07-30 13:47:27

Android中Dialog的相关文章

Android中Dialog的使用

上一篇博文讲到对话框popWindow的使用,这篇博文主要讲解Dialog的使用. 1.什么是Dialog? Dialog就是对话框的一种方式!在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择,这种对话框叫Dialog.最经常使用的,大家也比较熟悉的,也使用比较频繁有AlertDialog,这边篇博文将比较详尽的讲解Dialog的使用. 2.Dialog的特性 Android的对话框有两种:PopupWindow和Dialog.它们的不同点在

Android中Dialog对话框的调用及监听

Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter,C#中C/S中常用MessgeBox,总而言之就是一个功能弹,弹,弹,本文就简单的叙述一下Dialog的各种弹框使用及监听,顺便写了一个简单的自定义弹框,接下来请看正文: 一般对话框 先看下整个App页面: 看下一般对话框的结果: 具体代码的实现,其中定义了两个按钮,一个是确定(PositiveBu

Android中Dialog对话框(未完待续)

布局文件xml: 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中Dialog对话框

布局文件xml: 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进阶之旅------&gt;Android中Dialog系统样式讲解

今天在维护公司的一个APP的时候,有如下场景. 弹出一个AlertDialog的时候,在系统语言是中文的时候,如下所示: 弹出一个AlertDialog的时候,在系统语言是English的时候,如下所示: 可以发现在系统语言为英语的时候,对话框中的白色文字已经完全看不清楚,对话框的背景颜色也变成了白色.因此需要修改对话框的主题. 修改之前代码如下: AlertDialog commedialog = new AlertDialog.Builder( WalkieTalkieActivity.th

android 中dialog,toast,optionmenu,contextmenu的使用

这几个界面是activity附带主界面之外,开发中常常会用到的界面元素, dialog,toast的界面都是可以自定义的. optionmenu和contextmenu 的界面也可自定义,但是没有dialog那么灵活,它只能自定义一些title,item之类的. 1.dialog自定义界面 AlertDialog dialog=new AlertDialog.Builder(MainActivity.this).create(); dialog.setView(view); 2.toast自定义

Android 自定义Dialog类,并在Activity中实现按钮监听。

实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的按钮,Dialog类如下,在MyDialog这个类中实现了一个LeaveMyDialogListener接口,用来实现onclick的点击事件: package com.Ieasy.Tool; import com.Ieasy.ieasyware.R; import android.app.Dialog

android中给Dialog设置的动画如何自定义修改参数

============问题描述============ 在android中给Dialog设置动画的方法我只找到Dialog.getWindow().setWindowAnimation(int resID); 这样不是只能在styles里用xml定义动画吗? 但是我现在想要先用程序计算出一个屏幕上的点,在让Dialog从该点开始执行scaleAnimation. 我如何给我Dialog的动画设置起始点之类的参数呢? ============解决方案1============ 自定义一个dial

Android中控制Dialog呈现的时间

用线程控制dialog的呈现时间,思路很简单,直接show代码了,我也是为了方便自己记录 private void showProgressDialog() { pDialog = new ProgressDialog(mContext); pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); pDialog.setProgress(100); pDialog.setMessage("请稍等一秒..."); pDialog.se