【Android 源码解析】从源码角度深入理解Android中Dialog、PopUpWindow、Toast区别

【Android 源码解析】从源码角度深入理解Android中Dialog、PopUpWindow、Toast区别_第1张图片

在开发完这一期的项目之后,终于有点时间来总结下了~ 这两个月我主要在做一个产品详情页改造的需求,里面有这样一个需求:当业务加载完成之后,需要弹出一个toast,这个toast能显示出有多少人已经预定过该产品。具体UI显示如下所示:

看到这个需求,我脑海里立刻就复现了一个问题,“这个需求用自定义toast,自定义popupwindow,自定义dialog不是都能实现吗?这三者有什么区别呢?”。这几天我利用闲暇时间研究了下Toast、PopUpWindow和Dialog的源码,在这里跟大家分享下。同时,我还会分享下使用这三个控件的一些心得

首先我们先达成一个共识:Dialog、PopUpWindow、Toast等都属于子窗口,子窗口必须依附在父窗口上。

【一】Dialog实现机制

1、Dialog的基本使用:

(1)创建Dialog对象实例:

 

Dialog dialog = new Dialog(MainActivity.this);

(2)加载Dialog布局:

 

 

dialog.setContentView(R.layout.dialog);

(3)显示Dialog:

 

 

dialog.show();

2、从源码角度分析这三步是如何实现的:

 

(1)创建Dialog对象实例:
【Android 源码解析】从源码角度深入理解Android中Dialog、PopUpWindow、Toast区别_第2张图片

如上,Dialog的构造方法里的代码非常简单。首先通过getSystemService方法获得当前窗口的WindowManager对象(一个应用就只有一个WindowManager对象的实例)。其次,创建一个PhoneWindow。然后,对PhoneWindow进行一系列初始化。

(2)Dialog加载布局:

其实就是为PhoneWindow设置一个布局,跟Activity的setContentView一个道理。

(3)Dialog的显示:

【Android 源码解析】从源码角度深入理解Android中Dialog、PopUpWindow、Toast区别_第3张图片

在show方法里主要通过WindowManager的addView方法添加Dialog窗口

【二】PopUpWindow的实现机制

1、PopUpWindow的基本使用:

(1)加载popupwindow布局

 

View popWindow = LayoutInflater.from(MainActivity.this).inflat(R.layout.dialog, null);


(2)创建popupwindow实例

 

 

PopupWindow pw = new PopupWindow(popWindow,ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT, true);

(3)显示

 

 

pw.showAtLocation(parentView, Gravity.CENTER, 0, 0);


2、从源码的角度分析这三步是如何实现的:

 

(1)创建PopUpWindow实例

【Android 源码解析】从源码角度深入理解Android中Dialog、PopUpWindow、Toast区别_第4张图片
首先获得整个应用的WindowManager,然后给PhoneWindow设置布局,接着设置宽高等。

(2)showAtLocation的源码:

【Android 源码解析】从源码角度深入理解Android中Dialog、PopUpWindow、Toast区别_第5张图片

【三】Toast的实现机制

还没来得及看源码,不过从Dialog和PopUpWindow的源码来看,Toast也应该是通过PhoneWindow来实现。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Android)