Android Spinner、PopupWindow和Dialog的关系
来源:互联网 发布:单片机驱动发光二极管 编辑:程序博客网 时间:2024/06/05 11:36
最近再做一个从底部按钮点击弹出一列表框的效果,分别使用了Spinner
、PopupWindow
和Dialog
,本文不涉及三者的具体使用方法,这是来解答我对这三个相似的控件的疑惑。
下面总结一下他们的区别: Dialog在show()
或者dismiss()
时会有一个异步的回调,而PopupWindow
则没有,这并不是说PopupWindow
显示是阻塞的,而Dialog
的显示是非阻塞的,因为Dialog的异步回调都是在Dialog显示完之后才进行的,所以PopupWindow
和Dialog
的显示方式是一样的,阻塞和非阻塞是针对Dialog的回调来说的。 Dialog show()
方法源码:
public void show() { ···省略··· try { mWindowManager.addView(mDecor, l); mShowing = true; sendShowMessage(); } finally { } }
sendShowMeassage():
private void sendShowMessage() { if (mShowMessage != null) { // Obtain a new message so this dialog can be re-used Message.obtain(mShowMessage).sendToTarget(); } }
mShowMessage
会被mListenersHandler
接收,mListenersHandler
源码如下:
private static final class ListenersHandler extends Handler { private WeakReference<DialogInterface> mDialog; public ListenersHandler(Dialog dialog) { mDialog = new WeakReference<DialogInterface>(dialog); } @Override public void handleMessage(Message msg) { switch (msg.what) { case DISMISS: ((OnDismissListener) msg.obj).onDismiss(mDialog.get()); break; case CANCEL: ((OnCancelListener) msg.obj).onCancel(mDialog.get()); break; case SHOW: ((OnShowListener) msg.obj).onShow(mDialog.get()); break; } } }
在Dialog显示完之后会执行((OnShowListener) msg.obj).onShow(mDialog.get());
而OnShowListener
在这下面这段代码中进行设置。
public void setOnShowListener(OnShowListener listener) { if (listener != null) { mShowMessage = mListenersHandler.obtainMessage(SHOW, listener); } else { mShowMessage = null; } }
在Dialog
的dismiss()
方法中也是执行上述流程。
小结:在不调用Dialog
的setOnShowListener(OnShowListener listener)
方法时Dialog
的异步处理是没有用的,和PopupWindow
在使用上除了创建的方法不同,系统提供的默认布局不同,是没有本质区别的,如果选择自定义布局的话,两者可以实现的功能也是一样的。
Spinner
有两种模式:android:spinnerMode="dropdown"和android:spinnerMode="dialog"
而这两种模式分别就是显示一个DropdownPopup
和 DialogPopup
而Spinner
内部类:
private class DialogPopup implements SpinnerPopup, DialogInterface.OnClickListener { private AlertDialog mPopup; }
DialogPopup
是对AlertDialog
的封装,这个就是AlertDialog
就是android:spinnerMode="dropdown"
要显示的控件。
private class DropdownPopup extends ListPopupWindow implements SpinnerPopup(){}
DropdownPopup
是ListPopupWindow
的子类,而ListPopupWindow
又是对PopupWindow
的封装。
所以Spinner
的显示实际上就是显示一个AlertDialog
或者PopupWindow
.
Dialog源码分析:http://blog.csdn.net/qq_23547831/article/details/51289456
PopupWindow源码分析:http://blog.csdn.net/qq_23547831/article/details/51322574
- Android Spinner、PopupWindow和Dialog的关系
- android自定义tabwidget,popupwindow,spinner,dialog,listview
- Android的Dialog和PopupWindow的使用
- android中Dialog和PopupWindow的区别
- Android中Popupwindow和Dialog的区别
- Android中的Dialog和Popupwindow的区别
- android中Dialog和PopupWindow的区别
- Dialog和Popupwindow的区别
- Dialog和PopupWindow的区别
- Android自定义弹框Dialog和Popupwindow的封装使用
- Android spinner下拉框和dialog
- Android-Popupwindow和Dialog做弹出窗口
- Android自定义Dialog,Toast,Notification和PopupWindow
- PopupWindow和dialog的显示位置
- Android Spinner 用PopupWindow实现
- 自定义Dialog、带时间和日期的Dialog、PopupWindow、Notification
- Dialog和Popupwindow
- PopupWindow和Dialog
- CI Weekly #6 | 再谈 Docker / CI / CD 实践经验
- zephyr中net_buf的定义
- C语言中enum与typedef enum的用法
- Java servlet 之过滤器Filter详解
- 无法启动此程序,因为计算机中丢失chrome_elf.dll。尝试重新安装该程序以解决此问题
- Android Spinner、PopupWindow和Dialog的关系
- Eclipse,JDK,ADT以及Tomcat配置(包括关联源码)
- 有关树的知识点
- zigbee学习:示例程序SampleApp中按键工作流程
- java语法基础
- MySQL中information_schema 是什么
- Mongodb replication复制集的配置
- 范数和距离
- RecyclerView 点击事件