自定义popupwindow和dialog的区别与使用

来源:互联网 发布:arcgis数据视图做表格 编辑:程序博客网 时间:2024/05/17 22:41

     首先,popupwindow和dialog的最大区别就是,popupwindow是线程阻塞的,即当其出现的时候,activity的主线程是阻塞的,而dialog出现的时候不是线程阻塞的。

好了,下面分别介绍下像我一样的新手第一次接触这两者的时候该如何使用。

一.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); 

下面来设置dialog的动画,比如说出现和消失时候的动画
<style name="main_menu_animstyle">           <item name="android:windowEnterAnimation">@anim/window_in</item>           <item name="android:windowExitAnimation">@anim/window_out</item>   </style>
对应的window_in和window_out的文件
<?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种方式啦。





0 0
原创粉丝点击