当前位置: 首页 > news >正文

PopupWindow

PopupWindow

效果图

这里写图片描述

Demo

  • Project:CombinedChartDemo
  • File:MyPopupWindow.java

初始化

// 获取弹出的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);

相关文章:

  • mysqldump的实现原理
  • containerd正式从CNCF毕业!
  • java动态代理(JDK和cglib)
  • 巧用年线抓长线牛股的四种经典技巧
  • 说说spring注解
  • 爬虫入门(四)
  • CSS3D效果
  • 诈欺猎物160万+,同盾科技、猛犸等诈欺猎人们的反击战
  • µWebSockets:一种WebSocket服务器实现
  • 瞬间移动(组合数, 逆元)
  • Vue性能优化:如何实现延迟加载和代码拆分?
  • Guava - 并行编程Futures
  • Mybatis Generator逆向工程的使用
  • springMvc REST 请求和响应
  • 数字水印技术的研究现状与发展趋势
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • IOS评论框不贴底(ios12新bug)
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JAVA之继承和多态
  • MySQL几个简单SQL的优化
  • Rancher-k8s加速安装文档
  • TCP拥塞控制
  • Vim 折腾记
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 编写符合Python风格的对象
  • 大主子表关联的性能优化方法
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 入门到放弃node系列之Hello Word篇
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 详解NodeJs流之一
  • Java数据解析之JSON
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (二)学习JVM —— 垃圾回收机制
  • (分布式缓存)Redis哨兵
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • ./configure、make、make install 命令
  • .a文件和.so文件
  • .java 9 找不到符号_java找不到符号
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .Net Core和.Net Standard直观理解
  • .Net Redis的秒杀Dome和异步执行
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net6Api后台+uniapp导出Excel
  • .net快速开发框架源码分享
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET中使用Protobuffer 实现序列化和反序列化