1、系统自带AlertDialog使用
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setPositiveButton("yes",null)
.setNegativeButton("no",null)
.setTitle("this is title")
.setMessage("this is message");
AlertDialog dialog = builder.create();
dialog.show();
2、自定义Dialog
2.1、Dialog布局定义以及参数设置
//设置dialog的大小
WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();
layoutParams.width = 200*3;
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
window.setAttributes(lp);
dialog.getWindow().getDecorView().setPadding(0,0,0,0);//清除边距
//设置dialog的位置 不管怎么设置,dialog和边界都会有一个间隙
layoutParams.gravity = Gravity.BOTTOM;
layoutParams.x = -800;
layoutParams.y = -800;
dialog.getWindow().setAttributes(layoutParams);
2.2 根据自己的要求继承Dialog实现自定义*Dialog类
- 如果要改写系统默认的dialog使用的主题样式需要重写带2个参数的构造方法
- 如果需要dialog向外部界面传递数据,需要写接口方法
- 为了方便创建dialog,可以采用创建者模式
2.3.部分样式属性
<item name="android:windowFrame">@drawable/rectangle</item> //设置窗口的边框:
<item name="android:windowIsFloating">false</item>//设置dialog是否悬浮,下面图的效果是不悬浮
<item name="android:windowIsTranslucent">true</item> //窗口透明
<item name="android:background">@android:color/transparent</item>//设置对话框背景
<item name="android:windowNoTitle">true</item> //dialog设置没有标题栏
<item name="android:windowBackground">@color/popwindow_bg_color</item>//窗体背景
3、PopupWindow
3.1. 构造方法
- public PopupWindow()
- public PopupWindow(View contentView)
- public PopupWindow(int width, int height)
- public PopupWindow(View contentView, int width, int height)
- public PopupWindow(View contentView, int width, int height, boolean focusable)
总共5个构造方法,但是必须设置contentView、width、height这几个参数的值才行。(如果xml文件和代码中都设置了布局的宽高则以代码中的为标准)
3.2. PopupWindow显示
- showAsDropDown(View anchor): //相对某个控件的位置(正左下方),无偏移
- showAsDropDown(View anchor, int xoff, int yoff): //相对某个控件的位置,有偏移;xoff表示x轴的偏移,正值表示向右,负值表示向左;yoff表示相对y轴的偏移,正值是向下,负值是向上;
- showAtLocation(View parent, int gravity, int x, int y): //相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
(popupwindow为阻塞时窗口,当调用show方法后,会阻塞当前线程的继续运行。)
3.3. PopupWindow消失
popupwindow默认不会在底部有遮罩效果,需要自己设置
设置步骤:
popupWindow.setBackgroundDrawable(new BitmapDrawable());//设置dialog的背景图片,如果不设置的话,点击区域外dialog不会消失。
popupWindow.setOutsideTouchable(true);//外部是否可点击
popupWindow.setOnDismissListener()//回调时机:当popup消失时.
popupWindow.setTouchInterceptor//点击界面任何地方,都会调用该方法
3.4 常用函数介绍
- public void setTouchable(boolean touchable)
- public void setFocusable(boolean focusable)
- public void setOutsideTouchable(boolean touchable)
- public void setBackgroundDrawable(Drawable background)
1 setTouchable()
设置为true,则当前事件会交给当前的dialog进行处理,当设置为false时,事件会传递到dialog底层的activity进行处理。
2 setFocusable()
设置当前dialog是否可以获取焦点,默认值为false,既不可以获取到焦点。当popupwindow中含有edittext时需要设置这个值为true。如果是false,则edittext不可以输入。
3 setOutsideTouchable()
设置popupwindow的区域外是否可以点击,如果不设置,点击其他区域时,popupwindow不会消失。但是需要注意必须设置popupwindow的背景图片,这个属性才有效果。
Dialog和PopupWindow区别
(1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。
(2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。
(3)Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。
(4)Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题
(5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。
(6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
本质区别:Dialog是非阻塞式弹窗,而PopupWindow则相反。
参考:http://www.jianshu.com/p/e588d74b5c9f