PopupWindow思路和显示方式的详解
2015-12-16 14:53
323 查看
记录啊,记录
如果你熟悉AlertDialog的使用,那么PopupWindow也就可以轻车熟路了,它们在有些方面是很相似甚至想通的。
步骤顺序:
1.声明一个PopupWindow对象。
2.获取一个布局layout(通常是View对象),大多是通过inflater拿到的(和自定义Adapter中的getView()有99%的相像)。
3.初始化1的对象,初始化时需要传入一个变量,这个变量一般是一个布局文件也就是2得到的layout,里面包含需求的布局控件等,构造方法有好几个按需要选择吧。
可以:xxxx= new PopupWindow(layout);
也可以:xxxx = new PopupWindow(layout);xxxx.setContentView(view);
4.根据2的layout获取内部控件,并对内部控件设置监听事件等相关操作(这一步可以在3的前面,无所谓的)。
5.为了设置点击PopupWindow以外的区域,要设置两个属性:
xxxx.setBackgroundDrawable(yyyyy)
这个yyyyy是布局的背景的一个Drawable对象,例如getResources().getDrawable( R.drawable.bg_popupwindow);还可以是一个空new BitmapDrawable()对象;
xxxx.setOutsideTouchable(true);
触摸popupwindow外部,popupwindow消失。这个要求你的popupwindow要有背景图片才可以成功
6.有EditText这类需要焦点的控件是要设置如下属性:
xxxx.setFocusable(true);
7.在触发事件中显示PopupWindow:
大致是两种:
①showAsDropDowm(anchor, xoff, yoff,gravity):相对于控件显示。这个函数最多四个参数(第四个API19加的,没试过,忽略掉);第一个是显示的依托的坐标,它是一个控件,接下来的两个偏移量是根据该控件的左下为原点开始计算的,要注意的是向下的Y轴为正数,这点和平常的数学不一样。另外两个就是x轴和y轴对应的偏移量了,单位似乎是px,所以有时候需要换算dp;
②showAtLocation(anchor,gravity, xoff, yoff)相对于整个窗口显示。参数和上面一个基本差不多但是他们的作用其实是不一样的,这里的anchor是作为一个获取其最外边窗口Token(什么是Token?我也不知道)的工具,不依据它来计算,也就是说,这个anchor只要是窗口内的控件就可以;gravity就是在窗口中的位置,剩余两个和上面讲的一样,是两个偏移量。
8.取消PopupWindow:
xxxx.dismiss();
关于AlertDialog和PopupWindow的区别,网上都说是什么Alert是非阻塞的,就是说Alert显示时后台还可以做事情;pop是阻塞的,pop显示时后台是暂停的;
其实对于一般人来说,他们最主要的区别是AlertDialog基本只能显示在正中间,而PopupWindow更加灵活,容易定制一些。
到了这里应该粘贴一段代码的,但是我项目里的不想粘,又懒得新写一个,你可以对照别人的代码,参考这里的思路(如果你觉得思路对你有用的话);
BY:SHAREYE
如果你熟悉AlertDialog的使用,那么PopupWindow也就可以轻车熟路了,它们在有些方面是很相似甚至想通的。
步骤顺序:
1.声明一个PopupWindow对象。
2.获取一个布局layout(通常是View对象),大多是通过inflater拿到的(和自定义Adapter中的getView()有99%的相像)。
3.初始化1的对象,初始化时需要传入一个变量,这个变量一般是一个布局文件也就是2得到的layout,里面包含需求的布局控件等,构造方法有好几个按需要选择吧。
可以:xxxx= new PopupWindow(layout);
也可以:xxxx = new PopupWindow(layout);xxxx.setContentView(view);
4.根据2的layout获取内部控件,并对内部控件设置监听事件等相关操作(这一步可以在3的前面,无所谓的)。
5.为了设置点击PopupWindow以外的区域,要设置两个属性:
xxxx.setBackgroundDrawable(yyyyy)
这个yyyyy是布局的背景的一个Drawable对象,例如getResources().getDrawable( R.drawable.bg_popupwindow);还可以是一个空new BitmapDrawable()对象;
xxxx.setOutsideTouchable(true);
触摸popupwindow外部,popupwindow消失。这个要求你的popupwindow要有背景图片才可以成功
6.有EditText这类需要焦点的控件是要设置如下属性:
xxxx.setFocusable(true);
7.在触发事件中显示PopupWindow:
大致是两种:
①showAsDropDowm(anchor, xoff, yoff,gravity):相对于控件显示。这个函数最多四个参数(第四个API19加的,没试过,忽略掉);第一个是显示的依托的坐标,它是一个控件,接下来的两个偏移量是根据该控件的左下为原点开始计算的,要注意的是向下的Y轴为正数,这点和平常的数学不一样。另外两个就是x轴和y轴对应的偏移量了,单位似乎是px,所以有时候需要换算dp;
②showAtLocation(anchor,gravity, xoff, yoff)相对于整个窗口显示。参数和上面一个基本差不多但是他们的作用其实是不一样的,这里的anchor是作为一个获取其最外边窗口Token(什么是Token?我也不知道)的工具,不依据它来计算,也就是说,这个anchor只要是窗口内的控件就可以;gravity就是在窗口中的位置,剩余两个和上面讲的一样,是两个偏移量。
8.取消PopupWindow:
xxxx.dismiss();
关于AlertDialog和PopupWindow的区别,网上都说是什么Alert是非阻塞的,就是说Alert显示时后台还可以做事情;pop是阻塞的,pop显示时后台是暂停的;
其实对于一般人来说,他们最主要的区别是AlertDialog基本只能显示在正中间,而PopupWindow更加灵活,容易定制一些。
到了这里应该粘贴一段代码的,但是我项目里的不想粘,又懒得新写一个,你可以对照别人的代码,参考这里的思路(如果你觉得思路对你有用的话);
BY:SHAREYE
相关文章推荐
- The operation couldn’t be completed. (LaunchServicesError error 0.)问题解决
- 揭开MVC,MVP,MVVM,VIPER这几种模式的神秘面纱
- 使用LODOP实现循环打印
- linux使用openssl对socket通信加密
- ecshop整合discuz教程完美教程
- CentOS学习笔记之<添加用户到sudoers中>
- 搭建Tomcat服务器
- 启动tomcat的时候出现内存不足的错误
- Linux安装FTP
- centos服务器设置代理上网的方法
- centos服务器设置代理上网的方法
- centos7 iptables 外网地址轮训
- 运维工具Ansible—主机分组管理(hosts)
- zeus之shell基本命令
- Ubuntu:14.04.2 安装多个Linux内核
- TOMCAT线程池与SERVLET
- 在Ubuntu系统上搭建Hadoop 2.x(2.6.2)
- new Option()——实现时间联动
- Apache2.4在 win64 配置
- Linux:32/64位程序(应用程序、共享库、内核模块)