文档章节

Android:PopupWindow

Xushao
 Xushao
发布于 2013/12/16 15:59
字数 800
阅读 3.8K
收藏 9

3 月,跳不动了?>>>

一、概述

1、构造方法

部分常用:

PopupWindow(View contentView, int width, int height)
Create a new non focusable popup window which can display the contentView.
PopupWindow(View contentView, int width, int height, boolean focusable)
Create a new popup window which can display the contentView.

contentView为要显示的view,width和height为宽和高,值为像素值,也可以是MATCHT_PARENT和WRAP_CONTENT。

focusable为是否可以获得焦点,也可以通过set方法设置:

// Changes the focusability of the popup window
setFocusable(boolean focusable)


根据网上的资料,focusable参数的主要作用是:

如果focusable为false,在一个Activity弹出一个PopupWindow,按返回键,由于PopupWindow没有焦点,会直接退出Activity。如果focusable为true,PopupWindow弹出后,所有的触屏和物理按键都由PopupWindow处理。

如果PopupWindow中有Editor的话,focusable要为true。

 

二、初始化PopupWindow

/**
 * 初始化rightPopupWindow
 */
private PopupWindow initPopupWindow() {

	LayoutInflater inflater = LayoutInflater.from(this);
	View popView = inflater.inflate(R.layout.popupwindow_content, null);
	TextView item = (TextView) popView.findViewById(R.id.text_item);
		
	// 创建PopupWindow
	final PopupWindow popupWindow = createPopupWindow(popView);

	popView.setOnTouchListener(new View.OnTouchListener() {
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			if (rightPop != null && rightPop.isShowing()) {
				popupWindow.dismiss();
			}
			return true;
		}
	});

	item.setOnClickListener(new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			popupWindow.dismiss();
			// ...
		}
	});
		
	return popupWindow;
} 

三、创建一个PopupWindow

/**
 * 创建PopupWindow
 * 
 * @param popView
 *            指定PopupWindow的内容
 */
private PopupWindow createPopupWindow(View popView) {

	PopupWindow popupInstance = new PopupWindow(popView, LayoutParams.MATCH_PARENT,
			LayoutParams.MATCH_PARENT);
	popupInstance.setFocusable(true);
	popupInstance.setBackgroundDrawable(new ColorDrawable(0));
	popupInstance.setOutsideTouchable(true);
	// 监听器
	popupInstance.setOnDismissListener(new PopupWindow.OnDismissListener() {
		@Override
		public void onDismiss() {
			// ...
		}
	});

	return popupInstance;
}


四、显示


 例如一个button,点击该按钮,显示popupWindow,并且要求popupWindow显示在该按钮下面,则

btn.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		PopupWindow popupWindow = ...;
		popupWindow.showAsDropDown(v);
	}
});

另外,还支持指定位+置偏移量显示:

public void showAsDropDown(View anchor, int xoff, int yoff);

 

public void showAtLocation (View parent, int gravity, int x, int y)

Display the content view in a popup window at the specified location. If the popup window cannot fit on screen, it will be clipped. See WindowManager.LayoutParams for more information on how gravity and the x and y parameters are related. Specifying a gravity of NO_GRAVITY is similar to specifying Gravity.LEFT | Gravity.TOP.

Parameters
parent	a parent view to get the getWindowToken() token from
gravity	the gravity which controls the placement of the popup window
x	the popup's x location offset
y	the popup's y location offset


五、popupWindow显示优化

    1、动画效果

     例如显示的时候,从底部出现或者从顶部出现等,可以添加自定义动画效果。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="250"
        android:fromYDelta="100.0%"
        android:toYDelta="0.0" />

</set>

 

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="250"
        android:fromYDelta="0.0"
        android:toYDelta="100%" />

</set>



    2、其他效果

     默认的popupWindow显示的时候,是没有像Dialog那样的背景变成灰色半透明效果的。可以自己添加类似Dialog或ios那样的效果。

    例如,设置popupWindow的显示内容的布局文件的background属性为灰色半透明颜色,然后popupWindow在创建的时候指定宽、高属性为MATCH_PARENT即可实现除了popupWindow以外区域变成灰色半透明效果。

    当然,这个灰色区域,其实也属于popupWindow,只是没有真正的内容。这时候如果需要设置点击popupWindow以外区域让它自动消失的话,就需要额外处理。因为点击灰色部分,你仍然点击的是popupWindow本身。

    一种方法是给popupWindow的整个布局区域添加onTouch事件监听器,手动让popupWindow去dismiss()掉。

© 著作权归作者所有

Xushao
粉丝 88
博文 78
码字总数 54484
作品 0
杭州
程序员
私信 提问
加载中

评论(2)

光旭
光旭
叶秀兰
叶秀兰
显示?
Android Activity启动后立即弹出PopupWindow的两个方法

Activity启动后立即弹出PopupWindow的两个方法 若在Activity的onCreate()方法中直接写弹出PopupWindow方法会报错,因为activity没有完全启动是不能 弹出PopupWindow的。 那我们只需要在activ...

扬名立万
2014/05/28
2.3K
0
使用 PopupWindow 的注意事项

预备知识 使用 PopupWindow 之前, 一定要知道 Android 是怎么响应旋转屏幕的. 如果不知道的话, 那就先去了解下这个知识点. >>> Google 关键词: Android Activity 重建 另外需要知道的就是Pop...

有初啊
2013/11/07
1.3K
2
关于android.view.WindowLeaked异常的解决方案

虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考。 Android.view.WindowLeaked按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我...

程序袁_绪龙
2014/11/29
175
0
Android高手进阶教程(十)之----Android PopupWindow的使用!!!

大家好,我们这一节讲的是Android PopupWindow的使用! 在我理解其实PopupWindow其实类似于一个不能动的Widget(仅从显示效果来说!) 它是浮在别的窗口之上的. 下面我将给大家做一个简单的Demo,...

迷途d书童
2012/02/29
1.4K
0
关于popupwindow中双击EditText控件程序异常的问题

首先我的程序大概如下: 1.Activity中有一个Button事件用于出发显示popupwindow,定义popupwindow是在Activity的onCreate中,定义的代码如下: speedpop=new PopupWindow(getParent()); spe...

颠才泪狼空色
2013/10/18
704
1

没有更多内容

加载失败,请刷新页面

加载更多

Scala的运算符

在Scala中运算符的表示法不局限于字符, 中缀运算符可以是任何方法接受参数的方法 前缀运算符放在值的前面,只能是 + - ! ~ 四者之一, 方法名为unary_*(*为运算符) 后缀运算符是任何不接受参...

dreamness
2分钟前
0
0
GeJJSON

根据GeoJSON规范(RFC 7946):GeoJSON是一种对各种地理数据结构进行编码的格式。 GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几...

东东笔记
8分钟前
3
0
读写接口

针对一些输入/输出的场景,一般可能会涉及到读/写操作。比如,对一段字符串进行gzip压缩,或者解压缩,golang下主要通过两个接口来实现: 读的接口声明如下: type Reader interface {R...

道道法
昨天
9
0
mysql 运维命令

数据库备份导入 mysqldump -u root -p main_3_2_0 > /main_3_2_0.sqluse main_3_2_0source /main_3_2_0.sql #查询正在执行的sql show full processlist# 使用 kill id 来杀死进......

jxlgzwh
昨天
13
0
laravel路由权限开关(附黑名单防刷)

背景 : 今天开始这个版本的项目开发的时候,有一部分是优化系统的功能结构,其中就包括这个路由权限控制 (原本的意思是针对几个主要功能模块,做一个开关,以备线上可以做一些应急处理,后面...

冻结not
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部