自定义的PopUpWindow

 1 package com.example.widget;
 2
 3 import android.app.Activity;
 4 import android.content.Context;
 5 import android.graphics.drawable.ColorDrawable;
 6 import android.view.Gravity;
 7 import android.view.LayoutInflater;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.view.ViewGroup.LayoutParams;
11 import android.view.WindowManager;
12 import android.widget.PopupWindow;
13 import android.widget.TextView;
14
15 import com.example.home.R;
16
17 public class PickPicPopWindow extends PopupWindow {
18
19     private View view;
20     private TextView tv_pickPic_album;
21     private TextView tv_pickPic_camera;
22     private Activity activity;
23
24     public PickPicPopWindow(Activity context,OnClickListener itemsOnClick) {
25         // TODO Auto-generated constructor stub
26         super(context);
27         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
28         view = inflater.inflate(R.layout.pickpic_popwindow, null);
29
30         initPopUpWindow();
31
32         tv_pickPic_album = (TextView)view.findViewById(R.id.pickpic_tv_album);
33         tv_pickPic_camera = (TextView)view.findViewById(R.id.pickpic_tv_camera);
34
35         tv_pickPic_camera.setOnClickListener(itemsOnClick);
36         tv_pickPic_album.setOnClickListener(itemsOnClick);
37         this.activity = context;
38
39         setBackgroundGray(activity);
40     }
41
42     //背景变灰
43     public void setBackgroundGray(Activity activity)
44     {
45         WindowManager.LayoutParams lp=activity.getWindow().getAttributes();
46         lp.alpha = 0.7f;
47         activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
48         activity.getWindow().setAttributes(lp);
49     }
50
51     //清楚背景变灰
52     public void clearBackgroundGray(Activity activity)
53     {
54         WindowManager.LayoutParams lp=activity.getWindow().getAttributes();
55         lp.alpha = 1.0f;
56         activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
57         activity.getWindow().setAttributes(lp);
58     }
59
60     public void initPopUpWindow()
61     {
62         this.setOutsideTouchable(true);
63
64         this.setContentView(view);
65         this.setWidth(LayoutParams.FILL_PARENT);
66         this.setHeight(LayoutParams.WRAP_CONTENT);
67         this.setFocusable(true);
68
69         ColorDrawable dw = new ColorDrawable(0xffffffff);
70         this.setBackgroundDrawable(dw);
71
72         this.setOnDismissListener(new OnDismissListener() {
73
74             @Override
75             public void onDismiss() {
76                 // TODO Auto-generated method stub
77                 clearBackgroundGray(activity);
78             }
79         });
80     }
81
82     //popupwindow在某个控件的上面
83     public void showAsPullUp(View view, int x,int y)
84     {
85         int[] location = new int[2];
86         view.getLocationOnScreen(location);
87
88         this.getContentView().measure(0,0);    //强行绘制
89         int height = this.getContentView().getMeasuredHeight();
90
91         this.showAtLocation(view, Gravity.NO_GRAVITY, location[0]-x, location[1]-height-y);
92     }
93
94 }

注意:

popupWindow 获取高度 出现 -2,0,-1的问题?

出现这个的原因就是因为PopupWindow的尺寸拿不到,因为内容的View的width和height都是wrap_content,所以在PopupWindow里面的contentView还没被绘制出来的时候,这两个值都还是0。

如果直接调用PopupWindow的getWidth()和getHeight(),会发现拿到的都是ViewGroup.LayoutParams.WRAP_CONTENT的值 -2;

解决的方法就是在初始化contentView的时候,强制绘制contentView,并且马上初始化contentView的尺寸。

这里只需要一句代码即可:

this.getContentView().measure(0,0); //强行绘制
int height = this.getContentView().getMeasuredHeight();

时间: 2024-08-26 17:48:15

自定义的PopUpWindow的相关文章

Android2.3系统 自定义的PopupWindow在实例化时报空指针异常

情况:是这样的,前段时间做了一个自定义的PopupWindow,就是写一个类,然后继承PopupWindow,别的什么操作都没有,但是在实例化的时候,在2.3系统中直接就报空指针异常(4.0及以上系统中运行是好的.). 解决办法: 1.如果你自定义的类是一个无参的构造函数,则需要在构造函数中写上:super(); 例如: public MyPopupWindow(){ super(); } 2.如果你自定义的类中有带参数的构造函数,例如:参数为Context context.那么你就必须在构造函

Android popupwindow使用心得(一)

最近项目中好多地方用到popupwindow,感觉这个控件还是非常重要的.所以把使用心得总结下,废话不多说,直接上代码. public class MainActivity extends Activity { /** * 选择按钮 */ private Button mSelectTypeBtn; /** * 显示选择的内容 */ private TextView mSelectedType; private PopupWindow mPopupWindow; @Override protec

Android-自定义PopupWindow

Android-自定义PopupWindow 2014年5月12日 PopupWindow在应用中应该是随处可见的,很常用到,比如在旧版本的微信当中就用到下拉的PopupWindow,那是自定义的.新版微信5.2的ActionBar,有人已经模仿了它,但微信具体是使用了ActionBar还是其他的笔者倒是不太清楚,本篇博客主要介绍如何自定义一个PopupWindow来供自己在开发应用时使用.因为笔者最近在开发一款应用时用到这个知识点,所以自己实现了类似新版微信的效果. 源码下载:http://d

利用PopupWindow做出仿IOS样式的选择器

项目中总会遇到这样蛋疼的事情,android和ios同样的功能,都用的同样自带的控件,做出来的效果就是:android的丑的不行,ios的挺好看.于是,老大一拍屁股,android的改成和ios样式的一样就好了.然后,android开发就苦比了,凭空多出若干工作量.好了,话不多说,直接上代码吧.下面是我项目遇到的一个仿ios选择器的一个task,我边贴代码边说吧. 首先,看下这个选择器的布局文件. <?xml version="1.0" encoding="utf-8&

Android 底部弹出提示框的解决办法(使用Activity以及PopupWindow)

本片文章主要谈探讨了如何实现在底部弹出提示框背景为半透明效果的实现.想要实现此种效果一般有两种方式一个是使用Activity设置Theme另一种方式就是使用PopupWindow设置样式实现效果. 一,使用Activity 首先是此activity的布局文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.andro

android 集成系统分享和第三方分享案例

现在很多的应用基本都会集成分享这个功能,该功能包括系统分享(比如邮件,短信)和第三方分享(比如QQ和微信).其中有些公司会选择使用第三方的库来简化这些操作,加快开发,用的比较多的比如友盟社会化分享SDK,缺点就是自由度太低,因为可能你仅仅只是需要QQ和微信,其他的公司就会选择自己导入所需要的第三方SDK来自定义分享功能,自由度高,于是这篇博客主要来介绍后一种自定义分享功能的案例demo,下图是demo的运行效果: 具体分析一下源码,由于分享的内容根据需求的不同而不同,为了简单起见,我们就以最常用

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

Android 实现气泡布局/弹窗,可控制气泡尖角方向及偏移量

Android 自定义布局实现气泡弹窗,可控制气泡尖角方向及偏移量. 效果图 实现 首先自定义一个气泡布局. /** * 气泡布局 */ public class BubbleRelativeLayout extends RelativeLayout { /** * 气泡尖角方向 */ public enum BubbleLegOrientation { TOP, LEFT, RIGHT, BOTTOM, NONE } public static int PADDING = 30; public

Android上传图片之调用系统拍照和从相册选择图片

Android上传图片之调用系统拍照和从相册选择图片 前言: 万丈高楼平底起,万事起于微末.不知不觉距离上篇博文已近四个月,2015年12月17日下午发了第一篇博文,现在是2016年4月6日.时间间隔长的过分啊,我自己都看不下去了.原因呢?当然是自己的原因,其实是有很多时间来些博客的,但是这些时间都花在DOTA上了(还是太年轻啊).请原谅我的过错--. 一.概述: 现在几乎应用都会用到上传图片的功能,而要上传图片,首先得选择图片,本文不针对如何上传图片到服务器(每个项目与服务器交互的方式不同,因