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

在开发完这一期的项目之后,终于有点时间来总结下了~ 这两个月我主要在做一个产品详情页改造的需求,里面有这样一个需求:当业务加载完成之后,需要弹出一个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来实现。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值