当前位置: 首页 > 编程日记 > 正文

Android----PopupWindow

Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:
  AlertDialog的位置固定,而PopupWindow的位置可以随意
  AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的

PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;

按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。

具体如下:
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移

具体的Demo:

  1 public class SearchPop{
  2     private PopupWindow pop;
  3     private Context context;
  4     // 列表弹窗的间隔
  5     protected final int LIST_PADDING = 10;
  6     // 实例化一个矩形
  7     private Rect mRect = new Rect();
  8     // 坐标的位置(x,y)
  9     private final int[] mLocation = new int[2];
 10     // 位置不在中心
 11     private int popupGravity = Gravity.NO_GRAVITY;
 12     // 弹窗子类项选中时的回调监听接口
 13     private OnItemClickListener mItemListener;
 14     // 定义列表对象
 15     private ListView mListView;
 16     // 定义列表子类项 数据集合
 17     private ArrayList<String> mData = new ArrayList<String>();
 18 
 19     private void setData(ArrayList<String> mData){
 20         if(mData != null && !mData.isEmpty())
 21             this.mData = mData;
 22         else
 23             this.mData = new ArrayList<String>();
 24     }
 25     
 26     public SearchPop(Context context, ArrayList<String> mData) {
 27         this.setData(mData);
 28         this.context = context;
 29         View view = LayoutInflater.from(context).inflate(R.layout.popup_window, null);
 30         pop = new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
 31         pop.setContentView(view);
 32         // 设置可以获取焦点
 33         pop.setFocusable(true);
 34         // 设置弹窗内可点击
 35         pop.setTouchable(true);
 36         // 设置弹窗外可点击
 37         pop.setOutsideTouchable(true);
 38         // 设置popupWindows的宽度和高度
 39         pop.setWidth(LayoutParams.WRAP_CONTENT);
 40         pop.setHeight(LayoutParams.WRAP_CONTENT);
 41         // 设置背景
 42         // 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景(很神奇的)
 43         pop.setBackgroundDrawable(new BitmapDrawable());
 44         // 设置popupWindow的布局界面
 45 
 46         setupView();
 47     }
 48 
 49     private void setupView() {
 50         mListView = (ListView) pop.getContentView().findViewById(R.id.lvPopupWindow);
 51         mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 52             @Override
 53             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 54                 //点击item,popupWindow消失
 55                 pop.dismiss();
 56                 if(mItemListener != null)
 57                     mItemListener.onItemClick(mData.get(position), position);
 58             }
 59         });
 60     }
 61 
 62     public void showPopupWindow(View view) {
 63         // 获得点击屏幕的位置坐标
 64         view.getLocationOnScreen(mLocation);
 65         // 设置矩形大小
 66         mRect.set(mLocation[0], mLocation[1], mLocation[0] + view.getWidth(),
 67                 mLocation[1] + view.getHeight());
 68         // 显示popupWindow的位置
 69         pop.showAtLocation(view, popupGravity, LIST_PADDING, mLocation[1]+LIST_PADDING*2);
 70         mListView.setAdapter(myAdapter);
 71     }
 72     
 73     private BaseAdapter myAdapter = new BaseAdapter() {
 74         @Override
 75         public View getView(int position, View convertView, ViewGroup parent) {
 76             TextView tvText = null;
 77             convertView = LayoutInflater.from(context).inflate(R.layout.popup_window_item, null);
 78             tvText = (TextView) convertView.findViewById(R.id.tvPopupWindowItem);
 79             String item = getItem(position);
 80             tvText.setText(item);
 81             return convertView;
 82         }
 83         @Override
 84         public long getItemId(int position) {
 85             return position;
 86         }
 87         @Override
 88         public String getItem(int position) {
 89             return mData.get(position);
 90         }
 91         @Override
 92         public int getCount() {
 93             return mData.size();
 94         }
 95     };
 96     
 97     /**
 98      * 根据位置获得item
 99      * @param position
100      * @return
101      */
102     public String getAction(int position){
103         if(position < 0 || position>mData.size()){
104             return null;
105         }
106         return mData.get(position);
107     }
108     
109     /**
110      * 设置监听事件
111      * @param mItemListener
112      */
113     public void setItemClickListener(OnItemClickListener mItemListener){
114         this.mItemListener = mItemListener;
115     }
116     
117     /**
118      * 回调接口
119      * @author Administrator
120      *
121      */
122     public static interface OnItemClickListener{
123         void onItemClick(String item , int position);
124     }
125     
126 }

然后,在对button的事件监听中,调用showPopupWindow()方法,来实例化这个popupwindow.

在回调里面,写这个popupWindow的子类项点击事件的处理方法

pop.setItemClickListener(new OnItemClickListener){

public void onItemClick(String item, int position){

//点击 如何处理

}

}

注意事项:

1、构造popupwindow时,

pop = new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

一定要给出这个popupWindow的宽和高。 官方文档说明的很清楚,当不传递width,height参数时,构造出来的popupWindow的dimension只有0*0

2、在popupWindow中显示listview

1 pop.setFocusable(true)  

如果不设置, 则点击不到listview

3、点击popupWindow退出,另外还想点击屏幕其他位置退出,点击“back”键退出的话:

//设置外部可以点击
pop.setOutsideTouchAble(true);
// 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景(很神奇的)
pop.setBackgroundDrawable(new BitmapDrawable());

转载于:https://www.cnblogs.com/android-madan/p/3458976.html

相关文章:

GitLab 在中国成立公司极狐,GitHub 还会远吗?

作者 | 宋慧 责编 | 苏宓出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;开源的种子已在中国落地开花。今天&#xff0c;中国的开源圈再次迎来一大盛事&#xff1a;全球第二大开源代码托管和项目管理平台 GitLab与红杉宽带等基金正式宣布成立中国合资公司极狐信…

消除危害 让BYOD策略更安全的几个秘诀

自带设备办公(BYOD)已经不是什么新鲜的事情&#xff0c;在近些年&#xff0c;随着移动设备的发展&#xff0c;员工利用自带设备办公已经成为一件非常平常的事情。 但是由于出于安全问题的考虑&#xff0c;一些企业禁止员工通过自带设备连接到公司网络中进行办公。他们不允许个人…

图神经网络如何对知识图谱建模? | 赠书

几乎所有早期的知识图谱嵌入的经典方法都是在对每个三元组打分&#xff0c;在实体和关系的表示中并没有完全考虑到整幅图的结构。早期&#xff0c;图神经网络的方法在知识图谱嵌入中并没有被重视&#xff0c;主要由于&#xff1a;早期的图神经网络更多是具有同种类型节点和边的…

浅析ado.net获取数据库元数据信息

写这个文章源于早先对ADO.Net获取数据库元数据上的认识&#xff0c;去年我在阅读ADO.Net Core Reference的时候曾经注意过DataSet的FillSchema的这个方法。这方面&#xff0c;在我之前的随笔中提到过Typed DataSet&#xff0c;而FillSchem与WriteXmlSchema的结合使用可以获得数…

账户密码策略修改

由于是虚拟测试环境所以AD 和 Exchange安装在同一台虚拟机上&#xff0c;所以修改账户密码策略已达到降低密码是设置的复杂度。 1.打开 --开始--管理工具--组策略管理 2.选择--Default Domain Policy 右键编辑 3.选择计算机设置--策略--安全设置--账户策略--密码策略 4.调整--密…

什么是新IP的四层网络技术

新IP技术共有四层&#xff1a;物理底层、网络服务、控制服务和编排。通过这四个层级实现网络虚拟化和软件定义网络&#xff0c;下面就来详细说一说什么是新IP的四层网络技术。 物理底层 新IP技术依然是一种基于硬件的技术&#xff0c;脱离不了物理底层&#xff0c;所有的虚拟软…

按拼音模糊匹配查询条件的生成类

转载了好几个地方&#xff0c;很难确定最早的出处。将源码贴出来先。1usingSystem; 2usingSystem.Text; 3usingSystem.IO; 45namespacets6{ 7 class test 8 { 9 private static string[] startChars {"啊", "芭", "擦","搭…

Java架构技术文档:并发编程+设计模式+常用框架+JVM+精选视频

本篇文章是我们整理的一份架构师的成长路线&#xff0c;包括了并发编程、设计模式、常用框架、中间件、微服务与分布式、常用工具、JVM、MySQL、数据结构与算法&#xff0c;还有架构师精选视频、架构师成长路线高清大图。又是新的一年&#xff0c;每一年都会有人在成为架构师的…

linux tune2fs简解(每日一令之五)

1:命令简介Linux下的文件检测命令&#xff0c;且可以自行定义自检周期2&#xff1a;用法[rootuyhd000225 ~]# tune2fs --help tune2fs 1.39 (29-May-2006) tune2fs&#xff1a;无效选项 -- - Usage: tune2fs [-c max_mounts_count] [-e errors_behavior] [-g group][-i interva…

物联网技术正颠覆传统医疗行业

如果你或你的爱人最近正在接受治疗&#xff0c;你可能会觉察到一些很酷的新设备可以辅助诊断和治疗。然而&#xff0c;你可能没有意识到&#xff0c;一部分这些设备已连接到互联网&#xff0c;成为物联网生态系统的一个重要组成部分。 到底如何连接核磁共振成像仪、CT扫描仪或实…

数组的进一步使用

数组是数据结构中最基本的结构形式&#xff0c;它是一种顺序式的结构&#xff0c;存储的是同一类型的数据。每个数组元素都拥有下标&#xff08;index&#xff09;和元素值&#xff08;value&#xff09;&#xff0c;下标方便存取数据&#xff0c;而元素值就是被存储的数据。 数…

百度香港二次上市,12 岁开发者、AI 机器人同台敲响“芯片代码锣”

整理 | AI科技大本营&#xff08;ID:rgznai100&#xff09;今日&#xff0c;继 2005 年百度在纳斯达克上市后&#xff0c;百度在香港的第二次上市。上市首日开盘价254港元每股&#xff0c;截至发稿&#xff0c;为 252 港元每股&#xff0c;总市值约为 7129 亿港元。现场“敲锣人…

Linux启动流程(二)

//...根据grub内核映像所在路径,读取内核映像&#xff0c;并进行解压缩操作。并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备&#xff0c;完成Linux核心环境的建立1.start_kernel(init/main.c)中调用一系列初始化函数:(1) 在屏幕上打印出当前的内核版本信息…

写代码可能是成为软件工程师最容易的部分

当然&#xff0c;写代码是超级重要的&#xff0c;但是我认为它只是整个过程中的一小部分&#xff0c;且不一定是最难学的。 学习如何写代码要花些时间&#xff0c;但是只要有足够的训练&#xff08;每天写代码&#xff0c;坚持数年&#xff09;&#xff0c;你就能真正擅长它。 …

不是“重复”造轮子,百度飞桨框架2.0如何俘获人心

2016 年&#xff0c;百度 PaddlePaddle 打响了国产深度学习框架开源的第一枪。 2019 年 4 月&#xff0c;在 Wave Summit 深度学习开发者峰会上&#xff0c;首次发布了PaddlePaddle 的中文名“飞桨”&#xff0c;开始强调自己更适合中国开发者&#xff0c;以及更加专注于深度学…

基于Sql Server 2008的分布式数据库的实践(一)

原文 基于Sql Server 2008的分布式数据库的实践&#xff08;一&#xff09; 配置Sql Server 2008&#xff08;Win7&#xff09; 1.打开SQL server2012&#xff0c;使用windows身份登录 2.登录后&#xff0c;右键选择“属性”。左侧选择“安全性”&#xff0c;选中右侧的“SQL S…

HttpHand和HttpModule的详细解释,包括Asp.Net对Http请求的处理流程。

了解当用户对一个.aspx页面提出请求时&#xff0c;后台的Web服务器的动作流程。当对这个流程了解后&#xff0c;我们就会明白HttpHandler和HttpModule的作用了。 首先&#xff0c;来了解一下IIS系统。它是一个程序&#xff0c;负责对网站的内容进行管理&#xff0c;以及对客户的…

WebGL初探

目前&#xff0c;我们有很多方案可以快速的接触到 WebGL 并绘制复杂的图形&#xff0c;但最后发现我们忽视了很多细节性的东西。当然&#xff0c;这对初学 WebGL 是有必要的&#xff0c;它能迅速提起我们对 WebGL 的学习兴趣。当学习到更加深入的阶段时&#xff0c;我们更想了解…

Linux下用C语言最基本的程序开发与调试

1.建一个目录2.写代码&#xff0c;建一个hello.c文件代码&#xff1a;view plaincopy to clipboardprint?#include "stdio.h" main() { printf("Hello Linux.\n") } #include "stdio.h" main() { printf("Hello Linux.\n")…

全面升级!星环科技基础软件再升级,赋能数字中国建设

3月24日&#xff0c;星环科技举行2021线上发布会&#xff0c;支持10种主流数据模型的多模数据平台和数据云产品、实现AI建模的全生命周期管理人工智能等产品新版本齐齐亮相。 星环科技坚持核心技术自主原创&#xff0c;专注于大数据基础平台、分布式关系型数据库、数据开发与智…

脚本中echo显示内容带颜色显示

脚本中echo显示内容带颜色显示,echo显示带颜色&#xff0c;需要使用参数-e格式如下&#xff1a;echo -e "\033[字背景颜色&#xff1b;文字颜色m字符串\033[0m"例如&#xff1a;echo -e "\033[41;36m something here \033[0m"其中41的位置代表底色&#xf…

Java 8默认方法会破坏你的(用户的)代码

Java 8的默认方法试图尝试更进一步简化Java API。不幸的是&#xff0c;这一最近的语言扩展带来了一系列复杂的规则&#xff0c;但只有少部分Java开发者意识到这一点。这篇文章告诉你为什么引入默认方法会破坏你的&#xff08;用户的&#xff09;代码。 起初看来&#xff0c;默认…

JPA多对多关联

关于JPA多对多关系&#xff0c;这是使用学生与教师来表示。一个Student由多个Teacher教&#xff0c;同样一个Teacher也可以教多个学生。Student类如下&#xff1a; 1 package com.yichun.bean;2 3 import java.util.HashSet;4 import java.util.Set;5 6 import javax.persisten…

上市之后,青云存储平台 QingStor 也要“进军”云原生

作者 | 夕颜头图 | 下载于东方IC出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;3 月 16 日&#xff0c;北京青云科技股份有限公司&#xff08;以下简称“青云科技”&#xff09;登录科创板&#xff0c;昔日里频频出现在公众视野的云计算企业&#xff0c;终…

SQL Server 存储过程的分页方案比拼

建立表&#xff1a; CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI…

未来黑客入侵的不仅有电脑,还有人脑?

提到黑客入侵&#xff0c;我们能够知道的领域有很多&#xff0c;比如企业数据库、金融系统、个人信息、个人账户等。随着时代的变迁&#xff0c;人工智能、云计算、物联网等相继崛起&#xff0c;可能给黑客攻击的领域变得越发宽广。可是如果说黑客能攻击控制的不仅仅是电脑&…

不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令

我的BLOG里有一篇文章介绍了关于SQL注入的基本原理和一些方法。最让人感兴趣的也许就是前面介绍的利用扩展存储过程xp_cmdshell来运行操作系统的控制台命令。这种方法也非常的简单&#xff0c;只需使用下面的SQL语句&#xff1a;EXEC master.dbo.xp_cmdshell dir c:/但是越来越…

谷歌低调了 5 年的 Fuchsia OS,终于有望面世了!

种种迹象表明&#xff0c;低调了多年的 Fuchsia OS 可能就要出首个开发者版本了&#xff01;整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;千呼万唤始出来&#xff0c;等待了五年&#xff0c;谷歌 Fuchsia OS 的首个开发者版本终于有望面世了&#…

chrom扩展开发-入门

2019独角兽企业重金招聘Python工程师标准>>> 先了解一下chrome的两种功能延伸方式&#xff1a; * 扩展&#xff08;Extension&#xff09; 1.指的是通过调用 Chrome 提供的 Chrome API 来扩展浏览器功能的一种组件&#xff0c;工作在浏览器层面&#xff0c;使用 HT…

你的机器学习模型为什么会出错?奉上四大原因解析及五条改进措施

对开发者来说&#xff0c;目前有一系列的机器学习模型可供选择。雷锋网(公众号&#xff1a;雷锋网)了解&#xff0c;可以用线性回归模型预测具体的数值&#xff0c;用逻辑回归模型对不同的运算结果进行归类&#xff0c;以及用神经网络模型处理非线性的问题等等。 不论哪一种&am…