自定义popupwindow和dialog的区别与使用
来源:互联网 发布:arcgis数据视图做表格 编辑:程序博客网 时间:2024/05/17 22:41
首先,popupwindow和dialog的最大区别就是,popupwindow是线程阻塞的,即当其出现的时候,activity的主线程是阻塞的,而dialog出现的时候不是线程阻塞的。
好了,下面分别介绍下像我一样的新手第一次接触这两者的时候该如何使用。
一.Dialog
Dialog dg=new Dialog(context); dg.setContentView(int resource); dg.show();
下面给它逐步添加功能,比如增加事件,dialog在setContentView()之后如果要找到指定的组件,就要使用
dg.findViewById(int resource);
Button but=(Button) dg.findViewById(R.id.bb); but.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "but", 1).show(); } });现在对dialog的theme进行修改,比如我不想要dialog出现之后的黑屏。
<style name="dialog" parent="android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsFloating">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowIsTranslucent">true</item> <item name="android:backgroundDimEnabled">false</item></style>
设置style的时候最好在dialog实例化的时候进行
Dialog dg=new Dialog(context,R.style.dialog);
<style name="main_menu_animstyle"> <item name="android:windowEnterAnimation">@anim/window_in</item> <item name="android:windowExitAnimation">@anim/window_out</item> </style>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromXDelta="0" android:fromYDelta="1000" android:toXDelta="0" android:toYDelta="0" /> </set> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="0" android:toYDelta="1000" /> </set>
Window dialogWindow = dg.getWindow();dialogWindow.setWindowAnimations(R.style.main_menu_animstyle);
最后设置其显示的位置
设置Dialog的位置和大小与加载的布局文件无关。需自己设置dialog参数。
设置位置时必须先指定Dialog的gravity属性,否则指定大小无用。
* lp.x与lp.y表示相对于原始位置的偏移.
* 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
* 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
* 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
* 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
* 当参数值包含Gravity.CENTER_HORIZONTAL时
* ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
* 当参数值包含Gravity.CENTER_VERTICAL时
* ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
* gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
* Gravity.CENTER_VERTICAL.
*
* 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在
* 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了,
* Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
比如
Window dialogWindow = dg.getWindow();WindowManager.LayoutParams lp = dialogWindow.getAttributes();dialogWindow.setGravity(Gravity.RIGHT | Gravity.TOP);lp.y=50;dg.onWindowAttributesChanged(lp);
当以上都设置完毕之后就可以调用dg.show()显示了。
二.popupwindow
popupwindow设置位置的时候特别方便
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移。showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移。showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。
设置点击Popupwindow以外区域自动消失,注意一定要设置backgroundDrawable
//参数也可以是下面这俩值 //1、getResources().getDrawable(R.drawable.abc) //2、getWallpaper() //当你发现有背景色时,需给布局文件设置背景色,这样即可覆盖系统自带的背景色。 pw.setBackgroundDrawable(new BitmapDrawable()); pw.setOutsideTouchable(true);有种说法是pw.setFocusable(false);,则不点击区域以外不会消失。经测试,此种说法不对。
完整如下
View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.popup, null); PopupWindow pw=new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT,300); //参数也可以是下面这俩值 //1、getResources().getDrawable(R.drawable.abc) //2、getWallpaper() pw.setBackgroundDrawable(new BitmapDrawable()); pw.setOutsideTouchable(true); pw.showAsDropDown(findViewById(R.id.btn), 0,50);
好了,这就是2种方式啦。
- 自定义popupwindow和dialog的区别与使用
- Popupwindow的使用 -- 区别于Dialog, 显示位置可以自定义
- Dialog和Popupwindow的区别
- Dialog和PopupWindow的区别
- Android自定义弹框Dialog和Popupwindow的封装使用
- android中Dialog和PopupWindow的区别
- Android中Popupwindow和Dialog的区别
- Android中的Dialog和Popupwindow的区别
- android中Dialog和PopupWindow的区别
- 自定义Dialog、带时间和日期的Dialog、PopupWindow、Notification
- Android的Dialog和PopupWindow的使用
- Android自定义Dialog,Toast,Notification和PopupWindow
- 自定义dialog实现PopupWindow的效果
- PopupWindow和AlertDialog的使用和区别
- 自定义PopupWindow的使用
- Activity和自定义Dialog的区别
- 使用Builder模式封装Dialog和PopupWindow
- 分别用自定义PopupWindow和自定义Dialog实现下拉菜单
- markdown下编辑latex数学公式
- flask源码笔记:三,app.py模块(3)——Flask的初始化之请求和响应
- 数据结构题目,后续遍历
- flask源码笔记:三,app.py模块(4)——Flask的初始化之诸多属性
- 我所经历的大数据平台发展史1:非互联网时代-上篇
- 自定义popupwindow和dialog的区别与使用
- ViewPager + Fragment实现滑动标签页
- flask源码笔记:三,app.py模块(5)——Flask的初始化之__init__函数
- 简单 看SRL
- 初入android,android studio熟悉(一)
- ORA-00845 MEMORY_TARGET not supported on this system
- Java的数据类型
- Leetcode:235. Lowest Common Ancestor of a Binary Search Tree(JAVA)
- poj1149 PIGS-Dinic模板