PopupWindow在android.widget包下,弹出窗口的形式展示。官方文档对该控件的描述是:“一个弹出窗口控件,可以用来显示任意视图(View),而且会浮动在当前 活动(activity)的顶部”。PopupWindow可以让我们实现多种自定义控件,例如:menu、alertdialog等弹窗似的View。

一、PopupWindow的简单用法

在这个例子中,popupwindow在onCreate时初始化、通过触发事件展示出来。

java代码:public class ShowPopupWindow extends Activity implements View.OnClickListener {

View view;

PopupWindow pop;

Button btnShowAsDrawDown;

Button btnShowAsDrawDown1;

Button btnShowAtLocation;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.popup_activity);

btnShowAsDrawDown = (Button) findViewById(R.id.btnShowAsDrawDown);

btnShowAsDrawDown.setOnClickListener(this);

btnShowAsDrawDown1 = (Button) findViewById(R.id.btnShowAsDrawDown1);

btnShowAsDrawDown1.setOnClickListener(this);

btnShowAtLocation = (Button) findViewById(R.id.btnShowAt);

btnShowAtLocation.setOnClickListener(this);

initPopupWindow();

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()){

case R.id.btnShowAsDrawDown:

if (pop.isShowing()){

pop.dismiss();

}

else{

pop.showAsDropDown(v);

}

break;

case R.id.btnShowAsDrawDown1:

if (pop.isShowing()){

pop.dismiss();

}

else{

pop.showAsDropDown(v, 0, -160);

}

break;

default:

if (pop.isShowing()){

pop.dismiss();

}

else{

pop.showAtLocation(findViewById(R.id.main),

Gravity.CENTER_HORIZONTAL, 0, 0);

}

break;

}

}

private void initPopupWindow(){

view = this.getLayoutInflater().inflate(R.layout.popup_window, null);

pop = new PopupWindow(view, ViewGroup.LayoutParams.FILL_PARENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

pop.setOutsideTouchable(true);

view.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

pop.dismiss();

}

});

}

}

布局文件:popup_activity.xml<?xml version="1.0" encoding="utf-8"?>

android:orientation="vertical"

android:id="@+id/main"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="pop demo!"

/>

android:id="@+id/btnShowAsDrawDown"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Show as drawndown(one parameter)"

/>

android:id="@+id/btnShowAsDrawDown1"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Show as drawndown(three parameters)"

/>

android:id="@+id/btnShowAt"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Show At Location"

/>

布局文件:popup_window.xml<?xml version="1.0" encoding="utf-8"?>

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

android:gravity="center_horizontal"

android:background="#d3d3d3">

android:id="@+id/btn_pop"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Close"

android:layout_margin="10dip" />

二、一个能在自适应位置的PopupWindow

分享一个实例。看效果:

实现中使用的 PopupWindow。这里做了简单封装,其中有三个类组成:PopuItem、PopuJar、PopupWindows。public class PopuItem {

private Drawable icon;

private Bitmap thumb;

private String title;

private int actionId = -1;

private boolean selected;

private boolean sticky;

/**

* Constructor

*

* @param actionId Action id for case statements

* @param title Title

* @param icon Icon to use

*/

public PopuItem(int actionId, String title, Drawable icon) {

this.title = title;

this.icon = icon;

this.actionId = actionId;

}

/**

* Constructor

*/

public PopuItem() {

this(-1, null, null);

}

/**

* Constructor

*

* @param actionId Action id of the item

* @param title Text to show for the item

*/

public PopuItem(int actionId, String title) {

this(actionId, title, null);

}

/**

* Constructor

*

* @param icon [email protected] Drawable} action icon

*/

public PopuItem(Drawable icon) {

this(-1, null, icon);

}

/**

* Constructor

*

* @param actionId Action ID of item

* @param icon [email protected] Drawable} action icon

*/

public PopuItem(int actionId, Drawable icon) {

this(actionId, null, icon);

}

/**

* Set action title

*

* @param title action title

*/

public void setTitle(String title) {

this.title = title;

}

/**

* Get action title

*

* @return action title

*/

public String getTitle() {

return this.title;

}

/**

* Set action icon

*

* @param icon [email protected] Drawable} action icon

*/

public void setIcon(Drawable icon) {

this.icon = icon;

}

/**

* Get action icon

* @return [email protected] Drawable} action icon

*/

public Drawable getIcon() {

return this.icon;

}

/**

* Set action id

*

* @param actionId Action id for this action

*/

public void setActionId(int actionId) {

this.actionId = actionId;

}

/**

* @return Our action id

*/

public int getActionId() {

return actionId;

}

/**

* Set sticky status of button

*

* @param sticky true for sticky, pop up sends event but does not disappear

*/

public void setSticky(boolean sticky) {

this.sticky = sticky;

}

/**

* @return true if button is sticky, menu stays visible after press

*/

public boolean isSticky() {

return sticky;

}

/**

* Set selected flag;

*

* @param selected Flag to indicate the item is selected

*/

public void setSelected(boolean selected) {

this.selected = selected;

}

/**

* Check if item is selected

*

* @return true or false

*/

public boolean isSelected() {

return this.selected;

}

/**

* Set thumb

*

* @param thumb Thumb image

*/

public void setThumb(Bitmap thumb) {

this.thumb = thumb;

}

/**

* Get thumb image

*

* @return Thumb image

*/

public Bitmap getThumb() {

return this.thumb;

}

}

public class PopuJar extends PopupWindows implements OnDismissListener {

private View mRootView;

private ImageView mArrowUp;

private ImageView mArrowDown;

private LayoutInflater mInflater;

private ViewGroup mTrack;

private ScrollView mScroller;

private OnPopuItemClickListener mItemClickListener;

private OnDismissListener mDismissListener;

private List PopuItems = new ArrayList();

private boolean mDidAction;

private int mChildPos;

private int mInsertPos;

private int mAnimStyle;

private int mOrientation;

private int rootWidth=0;

public static final int HORIZONTAL = 0;

public static final int VERTICAL = 1;

public static final int ANIM_GROW_FROM_LEFT = 1;

public static final int ANIM_GROW_FROM_RIGHT = 2;

public static final int ANIM_GROW_FROM_CENTER = 3;

public static final int ANIM_REFLECT = 4;

public static final int ANIM_AUTO = 5;

/**

* Constructor for default vertical layout

*

* @param context Context

*/

public PopuJar(Context context) {

this(context, VERTICAL);

}

/**

* Constructor allowing orientation override

*

* @param context Context

* @param orientation Layout orientation, can be vartical or horizontal

*/

public PopuJar(Context context, int orientation) {

super(context);

mOrientation = orientation;

mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

if (mOrientation == HORIZONTAL) {

setRootViewId(R.layout.popup_horizontal);

} else {

setRootViewId(R.layout.popup_vertical);

}

mAnimStyle = ANIM_AUTO;

mChildPos = 0;

}

/**

* Get action item at an index

*

* @param index Index of item (position from callback)

*

* @return Action Item at the position

*/

public PopuItem getPopuItem(int index) {

return PopuItems.get(index);

}

/**

* Set root view.

*

* @param id Layout resource id

*/

public void setRootViewId(int id) {

mRootView = (ViewGroup) mInflater.inflate(id, null);

mTrack = (ViewGroup) mRootView.findViewById(R.id.tracks);

mArrowDown = (ImageView) mRootView.findViewById(R.id.arrow_down);

mArrowUp = (ImageView) mRootView.findViewById(R.id.arrow_up);

mScroller = (ScrollView) mRootView.findViewById(R.id.scroller);

//This was previously defined on show() method, moved here to prevent force close that occured

//when tapping fastly on a view to show quickaction dialog.

//Thanx to zammbi (github.com/zammbi)

mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

setContentView(mRootView);

}

/**

* Set animation style

*

* @param mAnimStyle animation style, default is set to ANIM_AUTO

*/

public void setAnimStyle(int mAnimStyle) {

this.mAnimStyle = mAnimStyle;

}

/**

* Set listener for action item clicked.

*

* @param listener Listener

*/

public void setOnPopuItemClickListener(OnPopuItemClickListener listener) {

mItemClickListener = listener;

}

/**

* Add action item

*

* @param action [email protected] PopuItem}

*/

public void addPopuItem(PopuItem action) {

PopuItems.add(action);

String title = action.getTitle();

Drawable icon = action.getIcon();

View container;

if (mOrientation == HORIZONTAL) {

container = mInflater.inflate(R.layout.action_item_horizontal, null);

} else {

container = mInflater.inflate(R.layout.action_item_vertical, null);

}

ImageView img = (ImageView) container.findViewById(R.id.iv_icon);

TextView text = (TextView) container.findViewById(R.id.tv_title);

if (icon != null) {

img.setImageDrawable(icon);

} else {

img.setVisibility(View.GONE);

}

if (title != null) {

text.setText(title);

} else {

text.setVisibility(View.GONE);

}

final int pos = mChildPos;

final int actionId = action.getActionId();

container.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if (mItemClickListener != null) {

mItemClickListener.onItemClick(PopuJar.this, pos, actionId);

}

if (!getPopuItem(pos).isSticky()) {

mDidAction = true;

dismiss();

}

}

});

container.setFocusable(true);

container.setClickable(true);

if (mOrientation == HORIZONTAL && mChildPos != 0) {

View separator = mInflater.inflate(R.layout.horiz_separator, null);

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);

separator.setLayoutParams(params);

separator.setPadding(5, 0, 5, 0);

mTrack.addView(separator, mInsertPos);

mInsertPos++;

}

mTrack.addView(container, mInsertPos);

mChildPos++;

mInsertPos++;

}

/**

* Show quickaction popup. Popup is automatically positioned, on top or bottom of anchor view.

*

*/

public void show (View anchor) {

preShow();

int xPos, yPos, arrowPos;

mDidAction = false;

int[] location = new int[2];

anchor.getLocationOnScreen(location);

Rect anchorRect = new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1]

+ anchor.getHeight());

//mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

mRootView.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

int rootHeight = mRootView.getMeasuredHeight();

if (rootWidth == 0) {

rootWidth = mRootView.getMeasuredWidth();

}

int screenWidth = mWindowManager.getDefaultDisplay().getWidth();

int screenHeight = mWindowManager.getDefaultDisplay().getHeight();

//automatically get X coord of popup (top left)

if ((anchorRect.left + rootWidth) > screenWidth) {

xPos = anchorRect.left - (rootWidth-anchor.getWidth());

xPos = (xPos < 0) ? 0 : xPos;

arrowPos = anchorRect.centerX()-xPos;

} else {

if (anchor.getWidth() > rootWidth) {

xPos = anchorRect.centerX() - (rootWidth/2);

} else {

xPos = anchorRect.left;

}

arrowPos = anchorRect.centerX()-xPos;

}

int dyTop = anchorRect.top;

int dyBottom = screenHeight - anchorRect.bottom;

boolean onTop = (dyTop > dyBottom) ? true : false;

if (onTop) {

if (rootHeight > dyTop) {

yPos = 15;

LayoutParams l = mScroller.getLayoutParams();

l.height = dyTop - anchor.getHeight();

} else {

yPos = anchorRect.top - rootHeight;

}

} else {

yPos = anchorRect.bottom;

if (rootHeight > dyBottom) {

LayoutParams l = mScroller.getLayoutParams();

l.height = dyBottom;

}

}

showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), arrowPos);

setAnimationStyle(screenWidth, anchorRect.centerX(), onTop);

mWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos);

}

/**

* Set animation style

*

* @param screenWidth screen width

* @param requestedX distance from left edge

* @param onTop flag to indicate where the popup should be displayed. Set TRUE if displayed on top of anchor view

* and vice versa

*/

private void setAnimationStyle(int screenWidth, int requestedX, boolean onTop) {

int arrowPos = requestedX - mArrowUp.getMeasuredWidth()/2;

switch (mAnimStyle) {

case ANIM_GROW_FROM_LEFT:

mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);

break;

case ANIM_GROW_FROM_RIGHT:

mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);

break;

case ANIM_GROW_FROM_CENTER:

mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);

break;

case ANIM_REFLECT:

mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Reflect : R.style.Animations_PopDownMenu_Reflect);

break;

case ANIM_AUTO:

if (arrowPos <= screenWidth/4) {

mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);

} else if (arrowPos > screenWidth/4 && arrowPos < 3 * (screenWidth/4)) {

mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);

} else {

mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);

}

break;

}

}

/**

* Show arrow

*

* @param whichArrow arrow type resource id

* @param requestedX distance from left screen

*/

private void showArrow(int whichArrow, int requestedX) {

final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp : mArrowDown;

final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown : mArrowUp;

final int arrowWidth = mArrowUp.getMeasuredWidth();

showArrow.setVisibility(View.VISIBLE);

ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams)showArrow.getLayoutParams();

param.leftMargin = requestedX - arrowWidth / 2;

hideArrow.setVisibility(View.INVISIBLE);

}

/**

* Set listener for window dismissed. This listener will only be fired if the quicakction dialog is dismissed

* by clicking outside the dialog or clicking on sticky item.

*/

public void setOnDismissListener(PopuJar.OnDismissListener listener) {

setOnDismissListener(this);

mDismissListener = listener;

}

@Override

public void onDismiss() {

if (!mDidAction && mDismissListener != null) {

mDismissListener.onDismiss();

}

}

/**

* Listener for item click

*

*/

public interface OnPopuItemClickListener {

public abstract void onItemClick(PopuJar source, int pos, int actionId);

}

/**

* Listener for window dismiss

*

*/

public interface OnDismissListener {

public abstract void onDismiss();

}

}public class PopupWindows {

protected Context mContext;

protected PopupWindow mWindow;

protected View mRootView;

protected Drawable mBackground = null;

protected WindowManager mWindowManager;

/**

* Constructor.

*

* @param context Context

*/

public PopupWindows(Context context) {

mContext = context;

mWindow = new PopupWindow(context);

mWindow.setTouchInterceptor(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {

mWindow.dismiss();

return true;

}

return false;

}

});

mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

}

/**

* On dismiss

*/

protected void onDismiss() {

}

/**

* On show

*/

protected void onShow() {

}

/**

* On pre show

*/

protected void preShow() {

if (mRootView == null)

throw new IllegalStateException("setContentView was not called with a view to display.");

onShow();

if (mBackground == null)

mWindow.setBackgroundDrawable(new BitmapDrawable());

else

mWindow.setBackgroundDrawable(mBackground);

mWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);

mWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);

mWindow.setTouchable(true);

mWindow.setFocusable(true);

mWindow.setOutsideTouchable(true);

mWindow.setContentView(mRootView);

}

/**

* Set background drawable.

*

* @param background Background drawable

*/

public void setBackgroundDrawable(Drawable background) {

mBackground = background;

}

/**

* Set content view.

*

* @param root Root view

*/

public void setContentView(View root) {

mRootView = root;

mWindow.setContentView(root);

}

/**

* Set content view.

*

* @param layoutResID Resource id

*/

public void setContentView(int layoutResID) {

LayoutInflater inflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

setContentView(inflator.inflate(layoutResID, null));

}

/**

* Set listener on window dismissed.

*

* @param listener

*/

public void setOnDismissListener(PopupWindow.OnDismissListener listener) {

mWindow.setOnDismissListener(listener);

}

/**

* Dismiss the popup window.

*/

public void dismiss() {

mWindow.dismiss();

}

}

Popu调用时在onCreate使用如下:PopuItem userItem = new PopuItem(ID_USER, "用户", getResources().getDrawable(R.drawable.child_image));

PopuItem grounpItem = new PopuItem(ID_GROUNP, "群组", getResources().getDrawable(R.drawable.user_group));

//use setSticky(true) to disable PopuJar dialog being dismissed after an item is clicked

userItem.setSticky(true);

//create PopuJar. Use PopuJar.VERTICAL or PopuJar.HORIZONTAL param to define layout

final PopuJar mPopu = new PopuJar(this, PopuJar.VERTICAL);

//add action items into PopuJar

mPopu.addPopuItem(userItem);

mPopu.addPopuItem(grounpItem);

显示popu:mPopu.show(v); //v表示显示在那个view下面

android 封装的popwindow,Android UI开发 popupwindow介绍以及代码实例相关推荐

  1. android 方向控制界面,Android Studio屏幕方向以及UI界面状态的保存代码详解

    项目:orientation package com.example.orientation; import android.os.bundle; import android.util.log; i ...

  2. android 封装状态页面,Android 缺省页状态切换方案

    MultiStatePage MultiStatePage的功能及特点 无需在布局添加视图代码 可显示自定义状态视图,任意拓展 可用于 Activity.Fragment.或指定的 View 自定义重 ...

  3. Android TV 智能电视/盒子 APP 开发焦点控制 两种方法实例

    感谢分享 http://www.7po.com/thread-564068-1-1.html 第一种方法: 采用Android自带的直接控制焦点上下左右的方法.这种方法的前提是必须知道每个view的i ...

  4. android封装aidl接口,Android远端接口AIDL及服务回调用法

    在UI线程和Service线程中经常需要进行数据通信,而除了Bundles之外的另一种方法便为AIDL,Demo(Pedometer)步骤.逻辑及代码: 首先先编辑好两个.aidl文件: IsStep ...

  5. 【Android -- UI开发】一份 UI 开发学习指南

    思维导图 推荐资料:官方文档 六大布局 网上有人比喻的很好:布局好比是建筑里的框架,组件按照布局的要求依次排列,就组成了用于看见的漂亮界面了. 请看文章:[Android – UI 开发]六大布局 U ...

  6. Android TV UI开发常用知识

    导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件,在leanback的依赖库中,这里介绍一些常用的组件,使用前需要导入leanback库. implementation ...

  7. Android UI开发第二十五篇——分享一篇自定义的 Action Bar

    Action Bar是android3.0以后才引入的,主要是替代3.0以前的menu和tittle bar.在3.0之前是不能使用Action Bar功能的.这里引入了自定义的Action Bar, ...

  8. android的UI开发工程师指引

    不管是MFC,还是linux,还是android,UI开发都是如下两大核心机制: 第一个是消息循环,第二个是界面组织结构. 围绕着这些,衍生出来的OpenGL,SurfaceView,SurfaceF ...

  9. Android UI开发第三十篇——使用Fragment构建灵活的桌面

    http://www.lupaworld.com/article-222973-1.html 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android ...

最新文章

  1. 网络编程(原始套接字)
  2. Matlab简单系统仿真示例1
  3. tableau实战系列(九)-用 ZN 函数处理数据缺失点
  4. PHP初级学习之PHP文件
  5. Linux 命令find、grep
  6. assistant字体_如何使用Google Assistant设置和致电家庭联系人
  7. Brackets (区间DP)
  8. 不显示表头_技术干货 | 基于数模混合型SoC实现的两线制高精度无源表头方案
  9. 简单的Postman,硬是玩出花!我能咋办
  10. python基础教程-《Python基础教程(第3版)》PDF高清版
  11. openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)
  12. 《写给程序员的数据挖掘实践指南》——5.2. 10折交叉验证的例子
  13. android usb pos机,USB支持安卓系统NFC刷卡器|RFID刷卡机ACR122U
  14. C# 使用 windowsmedia循环播放视频
  15. 马赛克密码破解——GitHub 热点速览 Vol.50
  16. 东芝自助结账设备市场份额增长近50%
  17. window.print() 实现A4纸张打图片分页,解决预览首页空白页、打印多出一张空白页问题
  18. 这-96到底是个什么东西?
  19. LinuxC编程中常见的段错误(非法操作内存)情形
  20. 语音识别(ASR)技术优势都有哪些?

热门文章

  1. hexo框架个人博客的搭建(面试加分!)
  2. QNX Hypervisor管理程序
  3. OFRecord 数据格式
  4. TensorRT 数据和表格示例
  5. 为放大器模拟输入模块提供可靠的输入过电压保护
  6. OPPO小游戏vConsole开启方法
  7. Cocos 属性常用参数
  8. Waiting for target device to come online
  9. Spark 分布式计算原理
  10. 汇编语言程序设计 实验九