自定义PopupWindow
PopupWindow,一个弹出窗口控件,可以用来显示任意View,而且会浮动在当前activity的顶部
自定义PopupWindow。
1.extends PopupWindow
2.构造方法中可以进行一些属性设置
setContentView(View convertView); //设置popupWindow显示的View
getContentView(); //获取popupWindow显示的view
setWidth(mWith); //设置popupWindow的宽度
setHeight(mHeight); //设置popupWindow的高度
设置宽高,也可以在构造方法那里指定好宽高, 除了可以写具体的值,还可以用WRAP_CONTENT或MATCH_PARENT, popupWindow的width和height属性直接和第一层View相对应。
setAnimationStyle(R.style.PopupAnimation); //设置弹出动画
setFocusable(true);
设置焦点,PopupWindow弹出后,所有的触屏和物理按键都由PopupWindows 处理。其他任何事件的响应都必须发生在PopupWindow消失之后,(home 等系统层面的事件除外)。 比如这样一个PopupWindow出现的时候,按back键首先是让PopupWindow消失,第二次按才是退出 activity,准确的说是想退出activity你得首先让PopupWindow消失,因为不并是任何情况下按back PopupWindow都会消失,必须在PopupWindow设置了背景的情况下。
而setFocusable(false); //PopUpWindow只是一个浮现在当前界面上的view而已,不影响当前界面的任何操作,是一个没有存在感的东西
一般情况下setFocusable(true);
setTouchable(true); // 设置popupwindow可点击
要让点击PopupWindow之外的地方PopupWindow消失:
1.setOutsideTouchable(true);
2.调用setBackgroundDrawable(new BitmapDrawable()); 设置背景,为了不影响样式,这个背景是空的。
除此之外,还可以这样写,setBackgroundDrawable(new ColorDrawable(0x00000000));背景不空,但是完全透明
经过实际检验,只要设置了背景,不管有没有设置setOutsideTouchable(true);即使设置了setOutsideTouchable(false);一样能够实现点击PopupWindow之外的地方PopupWindow消失,有点奇葩,不过为了保险起见,还是加上setOutsideTouchable(true);比较好。
PopupWindow还有一个方法,也是用来设置点击PopupWindow外部使得PopupWindow消失的,不过仅仅是实现这个方法是不行的,一样要设置背景才起作用。可是当设置了背景的时候,下面这个方法不管有没有用都能够实现点击PopupWindow外部使得PopupWindow消失,也是够醉。
setTouchInterceptor(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
if(event.getAction()==MotionEvent.ACTION_OUTSIDE)
{
dismiss();
return true;
}
return false;
}
});
设置PopupWindow的弹出位置
popupWindow = new SelectPicPopupWindow(参数);
popupWindow.showAtLocation(findViewById(R.id.settings_layout),
Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
//在这里findViewById(R.id.settings_layout)是当前界面的id。
设置了PopupWindow的background,点击Back键或者点击弹窗的外部区域,弹窗就会dismiss.相反,如果不设置PopupWindow的background,那么点击back键和点击弹窗的外部区域,弹窗是不会消失的.
如果我想要一个效果,点击外部区域,弹窗不消失,但是点击事件会向下面的activity传递,比如下面是一个WebView,我想点击里面的链接等.
/**
* 点击外部区域,弹窗不消失,但是点击事件会向下面的activity传递,要给Window设置一个Flag,
* WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
* 看了源码,这个Flag的设置与否是由一个叫mNotTouchModal的字段控制,但是设置该字段的set方法被标记为@hide。
* 所以要通过反射的方法调用:
* Set whether this window is touch modal or if outside touches will be sent
* to
* other windows behind it.
*
*/
public static void setPopupWindowTouchModal(PopupWindow popupWindow,
boolean touchModal) {
if (null == popupWindow) {
return;
}
Method method;
try { method = PopupWindow.class.getDeclaredMethod("setTouchModal",
boolean.class);
method.setAccessible(true);
method.invoke(popupWindow, touchModal); }
catch (Exception e) {
e.printStackTrace();
} }
然后调用setPopupWindowTouchModal(popupWindow, false);就可以了。
不过还有要注意的是:
1.设置了setHeight();假如设置的高度小于屏幕的高,那么透明的那一部分是不属于PopupWindow的。
2.设置setContentView(View v);由于v里面的组件在布局文件里并没有占满整个屏幕,例如只是放在了底部,使得弹出PopupWindow上部分出现了透明,这个透明部分还是属于PopupWindow的,那么要想做到点击透明部分使得PopupWindow消失,又该怎么做呢?
这个也不难,答案如下:
/**
*public class SelectPicPopupWindow extends PopupWindow
*/
private View popupView; popupView = inflater.inflate(R.layout.popup_window, null);
this.setContentView(popupView); popupView.setOnTouchListener(new OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
int height = popupView.findViewById(R.id.popup_layout).getHeight();
int y = (int) event.getY();
if(event.getAction() == MotionEvent.ACTION_UP){
if(y<height) {
dismiss();
}
}
return true;
}
});
转载请标明出处:
https://www.cnblogs.com/tangZH/p/6119483.html
自定义PopupWindow的更多相关文章
- 自定义PopupWindow弹出框(带有动画)
使用PopupWindow来实现弹出框,并且带有动画效果 首先自定义PopupWindow public class LostPopupWindow extends PopupWindow { pub ...
- Android 自定义Popupwindow 注意事项,手机和平板的区别
首先自定义ppw是要继承Popupwindow 的 而要成功的显示出自定义的ppw就必须实现下面的三句代码 // 必要的三要素下面,不然popWind显示不出来 this.setContentView ...
- Android自定义PopupWindow显示在控件上方或者下方
记录学习之用 View view = mInflater.inflate(R.layout.layout_popupwindow, null); PopUpwindowLayout popUpwind ...
- 自定义PopupWindow 怎么设置PopupWindow的宽度充满全屏宽度
自定义了一个MyPopMenu类,用于上图中的下拉筛选效果的. 但是按照网上有说需要: new PopupWindow(view,getWindowManager().getDefaultDispla ...
- 自定义PopupWindow动画效果
public class RollActivity extends Activity { private View view; private Button btn; private PopupWin ...
- Android 自定义PopupWindow动画效果
public class RollActivity extends Activity { private View view; private Button btn; private PopupWin ...
- Android笔记之自定义PopupWindow
效果图 popup_window_addition.xml <?xml version="1.0" encoding="utf-8"?> <L ...
- 自定义PopupWindow实现常用效果
package com.loaderman.customviewdemo; import android.content.Context; import android.view.View; impo ...
- Android之自定义AlertDialog和PopupWindow实现(仿微信Dialog)
我们知道,在很多时候,我们都不用Android内置的一些控件,而是自己自定义一些自己想要的控件,这样显得界面更美观. 今天主要是讲自定义AlertDialog和popupWindow的使用,在很多需求 ...
随机推荐
- 快速开发Grunt插件----压缩js模板
前言 Grunt是一款前端构建工具,帮助我们自动化搭建前端工程.它可以实现自动对js.css.html文件的合并.压缩等一些列操作.Grunt有很多插件,每一款插件实现某个功能,你可以通过npm命名去 ...
- Linux C++ 开发简介
主要介绍将Windows程序迁移到Linux系统相关知识 简介 Windows程序迁移到Linux系统可能需要修改很多代码, 既需要了解Linux平台的开发知识, 也需要了解Windows平台代码如何 ...
- WebEssentials 在vs2013 update5安装报错的解决方法.
WebEssentials 最高支持到update4 如果更新到了update5 RC, 则无法直接安装. 解决方法是 1,下载WebEssentials2013.vsix 文件. 2, 安装7zip ...
- Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志
12-3. 数据库连接日志 问题 你想为每次与数据库的连接和断开记录日志 解决方案 EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和 ...
- MailKit---获取邮件
MailKit是一个免费开源的邮箱类库,简单来说MailKit帮我们封装了有关邮箱的一些帮助类,提供方法让我们更容易使用邮箱的Smtp,Imap等邮箱协议. 现在的邮箱基本上都使用smtp协议从邮件服 ...
- Atitit 动态按钮图片背景颜色与文字组合解决方案
Atitit 动态按钮图片背景颜色与文字组合解决方案 转换背景颜色,setFont("cywe_img", fontScale, 50, 5) 设置文字大小与坐标 文字分拆,使用字 ...
- 让DIV中文字换行显示
1. <style> div { white-space:normal; word-break:break-all; word-wrap:break-word; } </style& ...
- vue.js 开发生态总结
---title: Vue 1.0 的技术栈date: 2016-09-26 00:48:50tags:category:--- ## vuejs概述 Vue.js是用于构建交互式的Web界面的库.它 ...
- [.Net] 手把手带你将自己打造的类库丢到 NuGet 上
手把手带你将自己打造的类库丢到 NuGet 上 序 我们习惯了对项目右键点击“引用”,选择“管理NuGet 程序包”来下载第三方的类库,可曾想过有一天将自己的打造的类库放到 NuGet 上,让第三者下 ...
- 多线程条件通行工具——Semaphore
Semaphore的作用是,限制线程通行的数量,如果线程进入时达到通行数量,便等待其它正在通行的线程释放. acquire()获取通行 release()释放通行 availablePermits() ...