在开发完这一期的项目之后,终于有点时间来总结下了~ 这两个月我主要在做一个产品详情页改造的需求,里面有这样一个需求:当业务加载完成之后,需要弹出一个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对象实例:
如上,Dialog的构造方法里的代码非常简单。首先通过getSystemService方法获得当前窗口的WindowManager对象(一个应用就只有一个WindowManager对象的实例)。其次,创建一个PhoneWindow。然后,对PhoneWindow进行一系列初始化。
(2)Dialog加载布局:
其实就是为PhoneWindow设置一个布局,跟Activity的setContentView一个道理。
(3)Dialog的显示:
在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实例
首先获得整个应用的WindowManager,然后给PhoneWindow设置布局,接着设置宽高等。
(2)showAtLocation的源码:
【三】Toast的实现机制
还没来得及看源码,不过从Dialog和PopUpWindow的源码来看,Toast也应该是通过PhoneWindow来实现。