Android PopupWindow弹窗动态显示在View的上下方,

news2024/9/19 7:30:37

序、周末不加班,

效果图如下。

我们要弹出的PopupWindow在View的下方,如果下方区域不够,则弹出在上方。

实现方案思路

我们在显示的时候,首先去计算一下弹窗高度。使用屏幕的高 - popupwind的高并且和popup的高做对比,如果大于的话,则显示在下方,如果小于的话,则显示在上方。

 /**
     *
     * @param anchorView 锚点View
     * @param contentView 弹出的View
     * @return
     */
    private int[] calculatePopWindowPos(final View anchorView, final View contentView) {
        final int[] windowPos = new int[2];
        final int[] anchorLoc = new int[2];
        // 获取锚点View在屏幕上的左上角坐标位置
        anchorView.getLocationOnScreen(anchorLoc);
        final int anchorHeight = anchorView.getHeight();
        // 获取屏幕的高宽
        final int screenHeight = getScreenHeight(anchorView.getContext());
        final int screenWidth = getScreenWidth(anchorView.getContext());
        contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        // 计算contentView的高宽
        final int windowHeight = contentView.getMeasuredHeight();
        final int windowWidth = contentView.getMeasuredWidth();
        // 判断需要向上弹出还是向下弹出显示
        final boolean isNeedShowUp = (screenHeight - anchorLoc[1] - anchorHeight < windowHeight);
        Log.i("AAAA", "screenWidth = "+screenWidth+"---"+"windowWidth="+windowWidth);
        if (isNeedShowUp) {
            windowPos[0] = (screenWidth - windowWidth)/2;
            windowPos[1] = anchorLoc[1] - windowHeight;
        } else {
            windowPos[0] = (screenWidth - windowWidth)/2;
            windowPos[1] = anchorLoc[1] + anchorHeight;
        }
        return windowPos;
    }

显示popupwindow如下

 Button btn1 = findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                View contentView = LayoutInflater.from(ListActivity.this).inflate(R.layout.layout_window, null);
                PopupWindow popupWindow = new PopupWindow(contentView,ViewGroup.LayoutParams.WRAP_CONTENT , ViewGroup.LayoutParams.WRAP_CONTENT);
                // 设置PopupWindow可以获得焦点,否则无法响应点击事件
                popupWindow.setFocusable(true);
//                popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

                int[] windowPos = calculatePopWindowPos(view, contentView);
                // 3. 显示PopupWindow
           
                popupWindow.showAtLocation(view,Gravity.TOP|Gravity.START, windowPos[0], windowPos[1]);
            }
        });

完毕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASP.NET Core SignalR 构建高效实时通信应用

目录 前言 SignalR的基本概念及其工作原理 1、核心概念 2、工作原理 前端环境准备 1、安装SignalR 2、创建SignalR连接 3、设置自动重新连接 4、监听连接状态 5、初始化连接 后端环境准备 1、注册SignalR 2、设置Hub 3、配置路由 4、发送和接收消息 实现聊天应用…

GraphRAG层级多标签文本分类任务实战(1)

1.概述 GraphRAG的本质是调用LLM生成知识图谱&#xff0c;然后在回答问题时检索相关内容输到prompt里&#xff0c;作为补充知识来辅助回答。那么有没有可能将这运用到层级多标签文本分类&#xff08;HMTC)任务中呢&#xff1f; 当然&#xff0c;乍一听有一点天方夜谭&#xf…

3 pytest Fixture

目录 3.1 通过 conftest.py 共享 fixture3.2 使用 fixture 执行配置及销毁逻辑3.3 使用 --setup-show 回溯 fixture 的执行过程3.4 使用 fixture 传递测试数据3.5 使用多个 fixture3.6 指定 fixture 作用范围3.7 使用 usefixtures 指定 fixture3.8 为常用 fixture 添加 autouse…

vue开发区分开发环境和生产环境,以及预发布环境

vue开发区分开发环境和生产环境&#xff0c;以及预发布环境 在根目录创建 .env[mode] 文件&#xff0c;在项目执行 npm run dev 的时候vite会自动去读取.env.development文件里面的配置&#xff0c;执行npm runbuild进行打包之后也会自动将.env.production的内容打包进去&…

MyBatis使用:拦截器,SpringBoot整合MyBatis

1、目标 本文的主要目标是学习使用MyBatis拦截器&#xff0c;并给出拦截器的实例 2、拦截器的使用 2.1 Intercepts注解和Signature注解 Intercepts注解&#xff0c;指定拦截哪个拦截器的哪个方法&#xff0c;还要指定参数&#xff0c;因为可能发生方法重载 按照顺序可以拦…

人脸识别签到系统

人脸识别签到系统是一种利用计算机视觉技术和生物识别技术自动识别个体面部特征并进行身份验证的应用系统。这种系统通常应用于需要快速且准确的身份验证场景&#xff0c;例如公司员工打卡、学校上课签到、大型活动入场等。下面是对该系统的详细介绍&#xff1a; 项目背景及目…

【硬件模块】LCD1602显示模块

LCD液晶显示模块实物图 字符型液晶显示模块&#xff0c;可显示16列2行&#xff0c;共32个字符&#xff0c;每个字符都由5x8像素点阵构成。 常见型号&#xff1a;1602&#xff08;16列2行&#xff09;&#xff1b;2004&#xff08;20列4行&#xff09;&#xff1b;12864&#xf…

不用下载!玩《黑神话·悟空》图文教程by无影云电脑,开机即玩

使用阿里云无影云电脑畅玩《黑神话悟空》游戏图文教程&#xff0c;不需要下载&#xff0c;超简单开机即玩。无影云电脑提供WeGame版镜像和Steam版镜像&#xff0c;开机就能玩。阿小云分享阿里云官方发布的用无影云电脑畅玩《黑神话悟空》游戏图文教程&#xff1a; 无影云电脑玩…

笔记本电脑数据恢复的最佳解决方案 - 100%快速和安全

到目前为止&#xff0c;数字设备已成为我们生活中不可或缺的一部分。电脑、手机和数码相机丰富了我们的生活&#xff0c;给我们带来了很多便利。近年来&#xff0c;笔记本电脑越来越受到人们的欢迎&#xff0c;主要是因为它相对较轻且易于携带。 但是&#xff0c;如果笔记本电脑…

C++必修:set/map,mutiset/mutimap的用法

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. set的介绍 在 C 中&#xff0c;set 是一种关联容器&#xff0c;用于存储唯一的…

JavaScript初级——DOM查询的其他方法

1、在document中有一个属性 body &#xff0c;保存的是body的引用。 2、document.documentElement 保存的是 html 根标签。 3、document.all 代表页面中所有的元素。 4、根据元素的 class 属性值查询一组元素节点对象 getElementsByClassName&#xff08;&#xff09;可以根…

c++中的const权限及static成员

c中的const权限 void Print() {cout << _year << "-" << _mouth << "-" << _day << endl; } void f(const Date& d) {d.Print(); } this指针为非const的&#xff0c;故需要 //void Print(const Date* this) voi…

【机器学习】数据预处理、特征缩放以及有偏分布的基本概念

引言 数据预处理是机器学习过程中的一个关键步骤&#xff0c;它涉及对原始数据进行清洗、转换和重塑&#xff0c;以提高模型的性能和准确性 文章目录 引言一、数据预处理1.1 定义1.2 步骤1.2.1 数据清洗1.2.2 数据转换1.2.3 数据重塑1.2.4 数据分割1.2.5 数据增强1.2.6 处理不平…

Java—基础知识总结 ٩(๑❛ᴗ❛๑)۶

目录&#xff1a; 一、Java基础知识 1、Java的语言特性&#xff1a; 2、Java的注释&#xff1a; 3、标识符&#xff1a; 4、关键字&#xff1a; 5、数据类型与变量&#xff1a; 1&#xff09;、常量&#xff1a; 2&#xff09;数据类型&#xff1a; 3&#xff09;、变量…

零基础5分钟上手亚马逊云科技-搭建CDN加速应用访问

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…

标准版v5.4安卓手机小程序扫码核销读取不到核销码的问题

修改这个文件&#xff0c;红色的那块代码替换成绿色的这段代码&#xff0c;然后重新打包上传。 文件地址&#xff1a;template/uni-app/pages/admin/order_cancellation/index.vue let path decodeURIComponent(res.path); self.verify_code path.split(‘code’)[1]; h5…

MTK的ATA工厂PCBA贴片验证测试

1.ATA测试就是PCBA硬件测试,目的如下 在工厂生产过程中,在PCB SMT贴装器件并烧录软件后,需要验证DUT(device under test)板上各个功能模块单元的driver基本功能是否正常,通过测试筛查出贴片异常或元器件物料异常等不良PCBA主板。 2.要进行此测试,MTK官方所要求的条件如下…

【C++】函数模板特化:深度解析与应用场景

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

【25届秋招】Shopee 0825算法岗笔试

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/25 &#x1f504; 输入输出&#xff1a;LeetCode格式 ⏳ 时长&#xff1a;2h 本试卷有10道单选&#xff0c;5道多选&#xff0c;3道编程。 整体难度非常简单&#xff0c;博主20min成功AK&#xff0c;这里只给出编…

Self-attention反向传播和梯度消失计算

文章目录 1、前言2、Self-attention的特点3、为什么是(Q, K, V)三元组4、归一化和放缩4.1、Normalization4.2、Scaled4.3、总结 5、Softmax的梯度变化5.1、Softmax函数的输入分布是如何影响输出的5.2、反向传播的过程中的梯度求导5.3、出现梯度消失现象的原因 6、维度与点积大小…