PopupWindow 使用详解(一) 中文API 文档 赠送 ListPopupWindow 中文 API
笔者数了数枕巾脱落的头发,发现了 Android 开发常用的类似于弹窗的悬浮窗口 大概是 PopupWindow 和 dialog。之前有还算具体的写过关于 dialog 以及自定义 dialog 甚至是 dialogActivity 的相关笔记,即:Android 系统原生dialog使用 、Android dialog Activity 使用 、android自定义相对复杂dialog 。突然感觉 PopupWindow 这个说简单不简单,说难不难的知识点也应该详细研究一下。
下面回归正题,请欣赏笔者的表演:
一、创建 PopupWindow
先说一下 Google 爸爸提供的构造方法
public PopupWindow() public PopupWindow(View contentView) public PopupWindow(int width, int height) public PopupWindow(View contentView, int width, int height) public PopupWindow(View contentView, int width, int height, boolean focusable) public PopupWindow(Context context) public PopupWindow(Context context, AttributeSet attrs) public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr) public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
数一数不多不少 9 个构造方法,一个无参的 8 个有参的,参数代表的意思分别为:View contentView
表示该 PopupWindow 内装载的内容,即展示各位用户的内容int width, int height
表示该 PopupWindow 对象的长度和宽度,参数可以是 ViewGroup.LayoutParams.WRAP_CONTENT
和ViewGroup.LayoutParams.MATCH_PARENT
也可以是具体的数值了。但是 这里规定的 是 PopupWindow 内加载到的 view 对象的大小。相当于 PopupWindow 设置的值 为 xml 内最外层布局是等效的。
如果,需要控制加载展示的 view 大小,那么需要将该参数设置ViewGroup.LayoutParams.WRAP_CONTENT
并且 目标样式外再包裹一层布局,类似于:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="200dp" android:layout_height="200dp" android:layout_centerInParent="true"> <ImageView android:id="@+id/iv_home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/app_name" android:src="@mipmap/home" /> </RelativeLayout> </RelativeLayout>
boolean focusable
PopupWindow 响应内部的点击事件,例如 TextView、Button 等Context context
上下文,不多讲
剩下下面的三个构造方法,不常用,但是会自定义 view 的大佬都知道啥意思。
二、常用设置方法
//设置动画特效 即 展示和消失动画 public void setAnimationStyle(int animationStyle) //主要作用是为了设置 PopupWindow 显示的时候是否会与 StatusBar 重叠(如果存在的话也包括 SystemBar ) public void setAttachedInDecor(boolean enabled) //设置 PopupWindow 的背景。该属性不设置的会,会导致 PopupWindow 出现后不会消失,即便是 点击 back 键也不起作用。这应该是 PopupWindow 较为变态的地方。 public void setBackgroundDrawable(Drawable background) //设置 PopupWindow 允许超出窗口 public void setClippingEnabled(boolean enabled) //设置 PopupWindow 内展示的内容 public void setContentView(View contentView) //设置 PopupWindow 的高度,类似于 3D 效果的阴影 public void setElevation(float elevation) //设置 PopupWindow的入场动画 public void setEnterTransition(Transition enterTransition) //有如就得有出 设置出场动画 public void setExitTransition(Transition exitTransition) //设置 popupWindow 是否可以获取焦点 public void setFocusable(boolean focusable) //设置 PopupWindow的高度 public void setHeight(int height) //脸颊事件 Events 都是有大小的当触摸点大于手指头大小时,则为 脸颊事件 ,蛮有意思的 你可以尝试一下。 public void setIgnoreCheekPress() //设置输入法的操作模式 public void setInputMethodMode(int mode) //监听 PopupWindow关闭的事件 public void setOnDismissListener(OnDismissListener onDismissListener) //设置 点击 PopupWindow意外区域,隐藏 popupWindow 然而并没有什么卵用 public void setOutsideTouchable(boolean touchable) // PopupWindow触摸时的监听回调 public void setTouchInterceptor(OnTouchListener l) //设置 PopupWindow是否可触摸 public void setTouchable(boolean touchable) //设置 popwindow 的宽度 public void setWidth(int width) //设置 PopupWindow布局类型 public void setWindowLayoutType(int layoutType)
设置 PopupWindow 显示位置 相对重要 拿出来写
//设置 PopupWindow 在某个控件的下方,某控件的左下角与 PopupWindow 的左上角对齐 public void showAsDropDown(View anchor) //设置 PopupWindow 在某个控件的下方,某控件的左下角与 PopupWindow 的左上角对齐,可以设置偏移量 向左为副 ,向右为正;向上为负,向下为正 public void showAsDropDown(View anchor, int xoff, int yoff) //设置 PopupWindow 在相当于父布局进行摆放,可以设置偏移量。 public void showAtLocation(View parent, int gravity, int x, int y) //隐藏 PopupWindow public void dismiss()
三、常用获取方法
//获取 PopupWindow 动画样式 public int getAnimationStyle() //获取 PopupWindow 背景 public Drawable getBackground() //获取 PopupWindow 设置的 view 返回一个view对象 public View getContentView() //获得 PopupWindow 的悬浮高度 public float getElevation() //获取 PopUpWindow 的入场动画 public float getElevation() //获取 PopupWindow 的出场动画 public Transition getExitTransition() //获取 PopupWindow 的高度 public int getHeight() //获取输入模式 public int getInputMethodMode() //获取 PopupWindow 是否应该与寄生(不太合理但是不知道用啥词)对象重叠 public boolean getOverlapAnchor() //获取 Popwindow 的宽度 public int getWidth() //获取 PopupWindow 的布局类型 public int getWindowLayoutType() //获取可以让 PopupWindow 设置的最大高度 public int getMaxAvailableHeight(View anchor) public int getMaxAvailableHeight(View anchor, int yOffset) //获取可以设置 PopupWindow 的最大高度,可以忽略软键盘。 public int getMaxAvailableHeight( View anchor, int yOffset, boolean ignoreBottomDecorations)
四、常用判断方法
//判断 PopupWindow 是否在超出父布局 public boolean isAboveAnchor() // 判断 PopupWindow 是否在父布局的 装饰上 public boolean isAttachedInDecor() //判读 PopupWindow 是否可以超出窗口 public boolean isClippingEnabled() //判断 PopupWindow 是否可以获取焦点 public boolean isFocusable() //判断 PopupWindow 是否相应自身以外的点击事件 public boolean isOutsideTouchable() //判断 PopupWindow 是否展示 public boolean isShowing() //判断 PopupWindow 是否支持多点触控 public boolean isSplitTouchEnabled() //判断 PopupWindow 是否支持触摸事件 public boolean isTouchable()
五、不常使用 更新位置或更新内容方法
//更新当前 PopupWindow public void update() //更新 Popwindow 到新的形态 参数:长度、宽度 public void update(int width, int height) //更新 Popwindow 到新的位置、新的形态 参数:新位置的坐标,长度、宽度 public void update(int x, int y, int width, int height) //同上 public void update(int x, int y, int width, int height, boolean force) //相对于宿主 更新体型 public void update(View anchor, int width, int height) //相对宿主更新 大小 位置 public void update(View anchor, int xoff, int yoff, int width, int height)
六、部分主要事项
1、
PopupWindow 默认是不允许超出窗口的,具体演示请看下篇笔记;
2、
PopupWindow 的 public void setOutsideTouchable(boolean touchable)
方法默认没有什么卵用 ,是否可以点击 PopupWindow 外部进行隐藏 PopupWindow ,必须设置 public void setBackgroundDrawable(Drawable background)
该方法
3、
getHeight()
和 getWidth()
方法不太好用,一般返回为 0;如果获取 PopupWindow 的长宽建议使用如下方法:
devPop.getContentView().measure(0, 0); int hight=devPop.getContentView().getMeasuredHeight(); int width=devPop.getContentView().getMeasuredWidth();
4、
将 PopupWindow 的四角设置为圆角方法,可以将事先准备的 view 的父布局加一个带有圆角的 shape background, 之后设置 PopupWindow 的 setBackgroundDrawable() 方法 设置为devPop.setBackgroundDrawable(new ColorDrawable(0x00ffffff));
5、
一定要在显示 PopupWindow 的界面的 OnDestroy()方法内调用 dismiss()方法,否则会产生 “意想不到”的惊喜。
@Override protected void onDestroy() { super.onDestroy(); if (popupWindow != null) { popupWindow.dismiss(); } }
6、
笔者遇到的注意事项,感觉目前就这么多了,之后如果遇到还会补充;
七、附赠 ListPopupWindow 相关汉语 API
1、效果展示
或许各位很多人都知道 PopupWindow 但是 少有人知道 ListPopupWindow ,故 展示效果如下,具体应用 请留意之后的 笔记。
2、相关 API
继承结构
(1)、构造方法
public ListPopupWindow( Context context) public ListPopupWindow( Context context, AttributeSet attrs) public ListPopupWindow( Context context, AttributeSet attrs,int defStyleAttr) public ListPopupWindow(Context context, AttributeSet attrs,int defStyleAttr, int defStyleRes)
构造方法就这四种,笔者常用的是第一种。
(2)、设置类方法
//为列表设置 适配器 public void setAdapter( ListAdapter adapter) //设置锚点 view 寄生的view public void setAnchorView(@Nullable View anchor) //为 ListPopupWindow 设置动画样式 public void setAnimationStyle( int animationStyle) //为 ListPopupWindow 设置背景 public void setBackgroundDrawable( Drawable d) //设置 ListPopupWindow 的宽度 单位:像素 public void setContentWidth(int width) //设置下拉列表的对齐方式 public void setDropDownGravity(int gravity) //设置 ListPopupWindow 的高度 单位:像素 public void setHeight(int height) //设置横向偏移量 单位:像素 public void setHorizontalOffset(int offset) //设置 Drawable 为列表的选择器 public void setListSelector(Drawable selector) //将 ListPopupWindow 设置为模态框 public void setModal(boolean modal) //设置 ListPopupWindow 提示位置 public void setPromptView( View prompt) //设置 ListPopupWindow 的选定位置 public void setSelection(int position) //设置 ListPopupWindow 输入区域的输入模式 public void setSoftInputMode(int mode) //设置 ListPopupWindow 的竖直方向偏移量 public void setVerticalOffset(int offset) //设置 ListPopupWindow 的宽度 public void setWidth(int width) //设置 ListPopupWindow 的布局类型 public void setWindowLayoutType(int layoutType) // 可将返回对象 添加到 源视图中,进而实现拖动并打开。 public OnTouchListener createDragToOpenListener(View src) //展示 ListPopupWindow public void show()
(3)、监听器
//设置 ListPopupWindow 关闭的 时的监听 public void setOnDismissListener(PopupWindow.OnDismissListener listener) //设置 ListPopupWindow 的 item 单击时的监听回调 public void setOnItemClickListener(AdapterView.OnItemClickListener clickListener) //设置 ListPopupWindow item 被选择 时的监听回调 public void setOnItemSelectedListener(OnItemSelectedListener selectedListener)
(4)、获取方法
//获取 ListPopupWindow 的锚点 view public View getAnchorView() //获取 ListPopupWindow 的动画样式 public int getAnimationStyle() //获取 ListPopupWindow 的背景 public Drawable getBackground() //获取 ListPopupWindow 的高度 public int getHeight() //获取 ListPopupWindow 的横向偏移量 public int getHorizontalOffset() //获取 ListPopupWindow 的 列表 public ListView getListView() //获取可选的 ListPopupWindow 的位置 public int getPromptPosition() //获取 ListPopupWindow 内被选中的 item public Object getSelectedItem() //获取被选中的 item 的 id public long getSelectedItemId() //获取被选中的 item 的位置 public int getSelectedItemPosition() //获取被选中的 view public View getSelectedView() //获取 垂直方向的偏移量 单位:像素 public int getVerticalOffset() //获取 ListPopupWindow 的宽度 public int getWidth()
(5)、判断方法
//判断是否为 模态框样式 public boolean isModal() //判断是否为显示状态 public boolean isShowing() //过了关键按键 点击事件 public boolean onKeyDown(int keyCode, KeyEvent event) //过滤关键按键 点击抬起事件 public boolean onKeyUp(int keyCode, KeyEvent event) //判断 是否 在指定 item 下执行点击事件 public boolean performItemClick(int position)
(6)、其他的重要方法
//执行相关 对 ui 线程的操作 public void postShow() //删除 当前列表的所有选择 public void clearListSelection() //关闭 ListPopupWindow public void dismiss()
3、关于 ListPopupWindow 的其它 杂谈
当发现这个 ListPopupWindow 算是控件的工具值,笔者舍去很多地方的 ListView 和部分AutoCompleteTextView 和 Spinner 控件使用,因为 ListPopupWindow 搭配 TextView 或者搭配 EditText 极其好用。
今天学习就到这里,笔者希望可以帮助各位在伙伴,欢迎大佬指点、批评还有建议;
之后的几篇笔者尽快写出来,只是一些 关于 ListPopupWindow 和 PopupWindow 的具体用法,相关源码会上传 github ;
不介意各位读者,帮忙点个心或者是加个关注哈 (︶.̮︶) !
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 动画初探
前言: 好久没来写文章了,一方面是因为自己懒了,另外一个是因为最近工作比较忙,没有闲时间(其实主要还是因为懒)。话说八月多换了一个新工作,在之前的公司,主要是横向发展,了解了很多技术。在现在的公司主要是纵向发展,更加深入的探索。之前是广而不精,没有深入学习。在现在的公司呢,能够更加深入的学习技术。就拿最近的工作来说吧,动画很多,刚开始只是知道Android动画分为属性动画、帧动画和补间动画。但是,他们之间有什么具体的区别就不是特别清楚了。尤其是属性动画和补间动画的区别,我能说自己被补间动画坑惨了吗?(其实,还是自己学艺不精,需要继续努力了。)好了,废话说多了,还是来看看今天的文章吧。 首先 要学习Android动画,我们以一个例子来深入学习,毕竟都是要把功能实现出来,写一些大而空没有实用性的东西,不但是敷衍别人,更是对自己的不负责任。如下图所示:(原谅我自恋一下,放了自己的图像照) Screenshot_20181023-200259.png Screenshot_20181023-200103.png 分析 1、要实现从大图到小图的过度,我们需要怎么实现呢?又需要用哪些技术呢?首先图...
- 下一篇
如果Android真的收费了,你怎么看?
声明:本文有终端研发部yuer原创发布,未经允许,不得转载 前言 今天突然看到一群里有人发了下面这样一张图片,然后群里又炸了! 于是又和同事讨论了android收费的问题,然后隔壁正在玩农药的UI妹子就笑了... 没错! 安卓可能要收费了!安卓可能要收费了!安卓可能要收费了! 欧盟两张罚单,谷歌白干半年 欧盟向来以反垄断法严厉著称,苹果、三星、英特尔、高通等巨头都吃过欧盟反垄断法的相关罚单。公开数据显示,2013年至今,欧盟已经因为反垄断法向多家企业罚款共计128.12亿欧元。只是,谷歌这次比较难受,相隔一年,吃了欧盟两张罚单,两张罚单还都创造了欧盟罚单的最高纪录,分别为24.2亿欧元、43.4亿欧元。 早在前几个月,大家都听说了,欧盟最近又搞事情,给谷歌开出了50亿美金的天价罚单。然后这导致的最直接的结果是什么呢? 其实,谷歌也表示很无奈:我把安卓开源拿给大家免费使用,给用户提供了一些自己开发的便利软件,你还要告我垄断。 Android(安卓)的免费生态系统可能将被打破 谷歌方面表示将对欧盟这一决定提出上诉,谷歌CEO桑达尔·皮查伊(Sundar Pichai)发表文章称由于欧盟的决...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用