PopupWindow

简介: PopupWindow效果图DemoProject:CombinedChartDemoFile:MyPopupWindow.

PopupWindow

效果图

这里写图片描述

Demo

初始化

// 获取弹出的PopupWindow的界面
View mContentView = View.inflate(context, R.layout.popupwindow, null);
// 创建一个PopupWindow并默认获取焦点(如果没有焦点view无法监听到点击事件)
PopupWindow mPopupWindow = new PopupWindow(mContentView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, true);
// ***给PopupWindow设置背景
mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

mPopupWindow.update();

显示

/**
 * 显示PopupWindow
 *
 * @param parent 父控件
 */
public void showPopupWindow(View parent) {
    // 获取父控件在窗体中的位置
    int[] location = new int[2];
    parent.getLocationInWindow(location);
    // 将PopupWindow显示在指定位置上
    mPopupWindow.showAtLocation(parent, Gravity.TOP | Gravity.START, location[0], location[1] + parent.getHeight());
}

隐藏

代码控制关闭

/**
 * 关闭PopupWindow
 */
public void dismiss() {
    if (null != mPopupWindow && mPopupWindow.isShowing()) {
        mPopupWindow.dismiss();
    }
}

点击PopupWindow以外任意位置关闭

// 设置PopupWindow之外的其他位置消失
mPopupWindow.setOutsideTouchable(true);

返回按钮控制关闭

// 监听点击返回键
mContentView.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                // 按返回键关闭PopupWindow
                dismiss();
                return true;
            default:
                return false;
        }
    }
});

开关

/**
 * 开关
 * @param parent 父控件
 */
public void toggle(View parent) {
    if (mPopupWindow.isShowing()) {
        dismiss();
    } else {
        showPopupWindow(parent);
    }
}

封装

package kong.qingwei.combinedchartdemo.view;

import android.content.Context;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.PopupWindow;

import kong.qingwei.combinedchartdemo.R;

/**
 * Created by kqw on 2016/5/17.
 * MyPopupWindow
 */
public class MyPopupWindow extends PopupWindow implements View.OnKeyListener {

    private PopupWindow mPopupWindow;
    private final View mContentView;

    public MyPopupWindow(Context context) {
        // 获取弹出的PopupWindow的界面
        mContentView = View.inflate(context, R.layout.popupwindow, null);
        // 监听点击返回键
        mContentView.setOnKeyListener(this);
        // 创建一个PopupWindow并默认获取焦点(如果没有焦点view无法监听到点击事件)
        mPopupWindow = new PopupWindow(mContentView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, true);
        // 设置PopupWindow之外的其他位置消失
        mPopupWindow.setOutsideTouchable(true);
    }



    /**
     * 显示PopupWindow
     *
     * @param parent 父控件
     */
    public void showPopupWindow(View parent) {
        // 获取父控件在窗体中的位置
        int[] location = new int[2];
        parent.getLocationInWindow(location);
        // 将PopupWindow显示在指定位置上
        mPopupWindow.showAtLocation(parent, Gravity.TOP | Gravity.START, location[0], location[1] + parent.getHeight());
    }

    /**
     * 关闭PopupWindow
     */
    public void dismiss() {
        if (null != mPopupWindow && mPopupWindow.isShowing()) {
            mPopupWindow.dismiss();
        }
    }

    /**
     * 开关
     * @param parent 父控件
     */
    public void toggle(View parent) {
        if (mPopupWindow.isShowing()) {
            dismiss();
        } else {
            showPopupWindow(parent);
        }
    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                // 按返回键关闭PopupWindow
                dismiss();
                return true;
            default:
                return false;
        }
    }

}

使用

// PopupWindow
MyPopupWindow myPopupWindow = new MyPopupWindow(context);

// 显示 
myPopupWindow.showPopupWindow(parentView);

// 开关
myPopupWindow.toggle(parentView);
相关文章
|
11月前
|
API Android开发 容器
PopupWindow
PopupWindow
102 0
Dialog和DialogFragment 设置背景透明
Dialog和DialogFragment 设置背景透明
868 0
|
Android开发 Java API
抽屉效果的实现(DrawerLayout和SlidingMenu的对比)
        在做谷歌电子市场的时候用的是DrawerLayout实现的抽屉效果,在新闻客户端的时候用的是开源框架SlidingMenu来实现的,总的来说,各有个的优点,侧滑(开源框架)实现的效果更好,但是DrawerLayout直接写布局文件就好了,不过我还是比较喜欢用开源框架的这个。下面分别来说说如何实现: 1、SlidingMenu  首先要引入SlidingMenu的库文件的
1235 0
|
Android开发
Android弹窗二则: PopupWindow和AlertDialog
前言 弹窗是图形界面必备的一个模块, 回忆一下windows那些恶心爆了的错误弹窗吧, 把弹窗制作的更高效友好一点是非常必要的. 这里说两个常用的弹窗类, PopupWindow和AlertDialog.
1122 0
|
XML Android开发 数据格式
ActionBar的使用
前言 山水一程,三生有幸。 启用ActionBar ActionBar需要在Android3.0以上的版本才能启用。如果希望关闭ActionBar,则可以设置该应用的主题为Xxxx.NoActionBar,配置如下。
964 0
|
Android开发
DrawerLayout侧滑详解
前面我们说了自定义侧滑菜单,也说了SlidingMenu的使用,这一节我们再来说下DrawerLayout。DrawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说DrawerLayout是因为第三方控件如SlidingMenu等出现之后,google借鉴而出现的产物。
1133 0
|
Java Android开发 容器
安卓框架——SlidingMenu使用技巧
SlidingMenu的一些常用属性 原文转载http://blog.csdn.net/zwl5670/article/details/48274109 [java] view plain copy   //设置侧滑菜单的位置,可选值LEFT , RIGHT ,LEFT_RIGHT(两边都有菜单时设置)   menu.
1092 0
|
Android开发 容器 数据格式
ViewGroup1——自定义布局
平时开发时,系统提供的几个布局基本就能满足我们的需求了。如果系统提供的布局无法满足需求,我们可以扩展ViewGroup类来实现自定义布局控件。
823 0