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);
相关文章
|
编解码 监控 API
|
API Android开发 容器
33. 【Android教程】悬浮窗:PopupWindow
33. 【Android教程】悬浮窗:PopupWindow
2063 2
|
10月前
|
存储 数据可视化 知识图谱
高效知识管理的五大方法,助力写作更上一层楼
在信息爆炸的时代,高效的知识管理是提升写作效率与质量的关键。本文探讨如何通过系统化的知识获取、分类存储、动态更新和高效检索,构建个人知识体系,并介绍智能化工具如看板的应用,帮助写作者整合信息、激发灵感、优化流程,实现从输入到输出的闭环,持续提升创作能力。
258 14
高效知识管理的五大方法,助力写作更上一层楼
|
JavaScript 前端开发
TS基础语法
TypeScript(缩写为TS)是一种静态类型的JavaScript超集,它为JavaScript添加了类型注解和其他扩展功能。下面是TypeScript的基础语法
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
2112 0
|
人工智能 监控 安全
百万并发,API 网关抗住了亚运会流量高峰
本文主要介绍作为亚运会所有核心流量的入口,阿里云推出了一款百万并发规格的 API 网关,抗住了亚运会流量高峰,为亚运会提供强大的技术支持。
817 105
|
Android开发
两种方法,教你解决 ViewPager 嵌套 ViewPager滑动冲突(一)
两种方法,教你解决 ViewPager 嵌套 ViewPager滑动冲突
|
算法 Java Android开发
Android 播放WEBP
Android 播放WEBP
802 0
Android 播放WEBP
|
XML Java 数据安全/隐私保护
Android 音乐APP(一)扫描本地音乐
Android 音乐APP(一)扫描本地音乐
733 0
Android 音乐APP(一)扫描本地音乐
|
Android开发
Android 音乐APP(五)音乐通知栏、后台播放音乐
Android 音乐APP(五)音乐通知栏、后台播放音乐
1575 0
Android 音乐APP(五)音乐通知栏、后台播放音乐