PopupWindow可以用来实现弹出任意位置的菜单,比Context Menu和Option Menu灵活性更高。
Android中弹出一个PopupWindow基本有两个方法:

1
2
//Display the content view in a popup window anchored to the bottom-left corner of the anchor view.
public void showAsDropDown(View anchor, int xoff, int yoff);

这个方法是弹出的窗口在anchor view的bottom-left,一般Android应用的菜单都在右上,实现思路就是以app中右上的view作为anchor,然后用屏幕宽度减去popup window的宽度作为xoff.

还有一个方法:

1
 public void showAtLocation(IBinder token, int gravity, int x, int y);

再来说如何实现一个PopupWindow,步骤基本如下,下面代码时extends了PopupWindow的子类的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//inflate一个content view并设置给PopupWindow
mContentView = (View) mInflater.inflate(R.layout.popup_window, null);
setContentView(mContentView); //给组件定义事件
mQuitView = (TextView) mContentView.findViewById(R.id.popup_window_quit);
mQuitView.setOnClickListener(this);
... ... //设置popup window的背景,如果设置了非null,PopupWindow内部会将其包起来作为root view展示
//如果设置了null,则setOutsideTouchable(true)不起作用
setBackgroundDrawable(...); //设置在popup window之外点击dismiss window
setOutsideTouchable(true); //如果设置为true, popup window打开的话,系统menu键就不响应了,back键还可以响应,因为PopupWindow内部接收了back键但没关menu键
//所以假如要用menu键来控制popup window的打开和关闭的话,就需要额外的实现,后面会讲。
setFocusable(true); //setWidth和setHeight是必须的,不然window没尺寸,但又不想hardcoded尺寸的话怎么办?用如下的方法
mContentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
setWidth(mContentView.getMeasuredWidth());
setHeight(mContentView.getMeasuredHeight());

再来讲刚才说到的用系统menu来控制popup window的方法:
1, 自定义自己的content view;
2, 在自定义的content view中接收menu key event(dispatchKeyEvent);
到此为止,如果popupWindow.setFocusable(true),则自定义content view的dispatchKeyEvent不会被执行,必须加上:
3, setFocusableInTouchMode(true);

使用PopupWindow的更多相关文章

  1. Android PopupWindow Dialog 关于 is your activity running 崩溃详解

    Android PopupWindow Dialog 关于 is your activity running 崩溃详解 [TOC] 起因 对于 PopupWindow Dialog 需要 Activi ...

  2. Android popupwindow使用心得(一)

    最近项目中好多地方用到popupwindow,感觉这个控件还是非常重要的.所以把使用心得总结下,废话不多说,直接上代码. public class MainActivity extends Activ ...

  3. 不得不吐槽的Android PopupWindow的几个痛点(实现带箭头的上下文菜单遇到的坑)

    说到PopupWindow,我个人感觉是又爱又恨,没有深入使用之前总觉得这个东西应该很简单,很好用,但是真正使用PopupWindow实现一些效果的时候总会遇到一些问题,但是即便是人家的api有问题, ...

  4. 仿QQ空间根据位置弹出PopupWindow显示更多操作效果

    我们打开QQ空间的时候有个箭头按钮点击之后弹出PopupWindow会根据位置的变化显示在箭头的上方还是下方,比普通的PopupWindow弹在屏幕中间显示好看的多. 先看QQ空间效果图:       ...

  5. 自定义PopupWindow

    PopupWindow,一个弹出窗口控件,可以用来显示任意View,而且会浮动在当前activity的顶部 自定义PopupWindow. 1.extends PopupWindow 2.构造方法中可 ...

  6. PopupWindow 使用

    昨天马失前蹄,为了做一个小键盘,耽误了两个小时,记录一下心路历程 1.关于需求与选择 需求: 点击一个按钮,弹出一个小键盘(类似于输入法键盘) 选择: (1)方案一:KeyboardView 这是百度 ...

  7. popupwindow的基本使用以及基本动画效果

    1.创建一个popupwindow view的布局文件自己写一个就好了,这里就不说了 View view= LayoutInflater.from(context).inflate(R.layout. ...

  8. Android -- PopupWindow(其中嵌套ListView 可以被点击)

    1. 效果图

  9. Android开发学习之路-PopupWindow和仿QQ左滑删除

    这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像 ...

  10. android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

    需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...

随机推荐

  1. 关于webpack抛出对象到全局的问题

    一般情况下,我们用webpack的时候.大多是用在单页应用上. 单是,某些情况下,我们用来做多页面的时候,有的时候,会需要在html内嵌 <script>,比如说,这个页面是服务端渲染的, ...

  2. 安卓、swiper标准的文字滚动

    溢出滚动基本原理还是relative,absolute.  核心高度  swiper-wrapper 和gun-swiper-slide 的自适应高度成为关键 <style> .gun-s ...

  3. 极光推送 JPush 项目简单使用

    打开或者关闭推送 - (void)pushSwitch:(UISwitch *)sender { if (sender.on) { [[NSUserDefaults standardUserDefau ...

  4. Hmmer安装与使用

    Hmmer的安装与使用   从功能基因研究的角度来讲,相关的搜索,比如从序列数据库中,找同源的序列,或者对一个对一个新的基因功能进行鉴定,使用hmmer比使用blast有着更高的灵敏度已经更高的搜索速 ...

  5. JS获取checkbox的个数

    本文算是转载自网络,当时用了他的函数,现在想总结一下,但忘了原文地址了 ================================================================ ...

  6. nginx basic auth 登陆验证模块

    #1. 新建一个pw.pl文件专门用来生成密码 #!/usr/bin/perl use strict; my $pw=$ARGV[0]; print crypt($pw,$pw)."\n&q ...

  7. C# 向IQueryable添加一个Include扩展方法

    using System; using System.Data.Objects; using System.Linq; namespace OutOfMemory.Codes { /// <su ...

  8. EF--Codefirst 加密数据库连接字符串

    http://www.tuicool.com/articles/QvYbEn 一.EF,CodeFirst加密SQL连接符 public LifeHelpContext() : base(" ...

  9. Centos 7.0查看硬盘使用情况 命令

    查看硬盘使用情况 df -hl [root@localhost ~]# df -hl文件系统         容量    已用    可用    已用%.     挂载点/dev/sda3       ...

  10. GoLang之网络

    GoLang之网络 Go语言标准库里提供的net包,支持基于IP层.TCP/UDP层及更高层面(如HTTP.FTP.SMTP)的网络操作,其中用于IP层的称为Raw Socket. net包的Dial ...