android PopWindow弹不出输入法和遮挡输入框的问题

背景,在popWindow弹输入法,注意两个地方,

  1. 当前版本号
  2. pop要获取焦点

兼容版本号

弹出软键盘

private fun showSoftInput() {if (Build.VERSION.SDK_INT >= 30) {"版本大于等 30".log()binding.etNewUser.windowInsetsController?.show(WindowInsetsCompat.Type.ime())} else {// 获取焦点拉起软键盘binding.etNewUser.requestFocus()val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManagerimm.showSoftInput(binding.etNewUser, InputMethodManager.SHOW_IMPLICIT)}}

隐藏软键盘

private fun hideSoftInput() {if (Build.VERSION.SDK_INT >= 30) {"版本大于等 30".log()binding.etNewUser.windowInsetsController?.hide(WindowInsetsCompat.Type.ime())} else {val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManagerimm.hideSoftInputFromWindow(binding.root.windowToken, 0)}}

获取焦点

 fun show(parent: View) {isFocusable = trueshowAtLocation(parent, Gravity.NO_GRAVITY,0,0)}

遮挡输入框

思路:用父布局的原高度 + 软键盘弹出的高度 设置为父布局的新高度,软键盘就实际是覆盖了空白的部分,就不会遮挡住原popupWindow的内容了

注意:不要在根布局使用ConstraintLayout,使用LinearLayout或者其他布局。


import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;/*** Created by KillaXiao on 2019/8/14.* 监听软键盘的弹出与收起, 在部分手机测试到,popupwindow里面有edittext的时候,弹出软键盘,会覆盖掉从底部弹出的popupwindow内容*/
public class SoftKeyBoardListener {private View rootView;  //activity的根视图int rootViewVisibleHeight;  //纪录根视图的显示高度private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;public SoftKeyBoardListener(Activity activity) {//获取activity的根视图rootView = activity.getWindow().getDecorView();Rect r = new Rect();rootView.getWindowVisibleDisplayFrame(r);int visibleHeight = r.height();rootViewVisibleHeight = visibleHeight;//监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {//获取当前根视图在屏幕上显示的大小Rect r = new Rect();rootView.getWindowVisibleDisplayFrame(r);int visibleHeight = r.height();System.out.println(""+visibleHeight);if (rootViewVisibleHeight == 0) {rootViewVisibleHeight = visibleHeight;return;}//根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变if (rootViewVisibleHeight == visibleHeight) {return;}//根视图显示高度变小超过200,可以看作软键盘显示了if (rootViewVisibleHeight - visibleHeight > 200) {if (onSoftKeyBoardChangeListener != null) {onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);}rootViewVisibleHeight = visibleHeight;return;}//根视图显示高度变大超过200,可以看作软键盘隐藏了if (visibleHeight - rootViewVisibleHeight > 200) {if (onSoftKeyBoardChangeListener != null) {onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);}rootViewVisibleHeight = visibleHeight;return;}}});}private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;}public interface OnSoftKeyBoardChangeListener {void keyBoardShow(int height);void keyBoardHide(int height);}public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);}
}

在popwindow中使用:

private fun softInputListener(context:Activity){SoftKeyBoardListener.setListener(context,object:SoftKeyBoardListener.OnSoftKeyBoardChangeListener{override fun keyBoardShow(height: Int) {"keyBoardShow : $height".log()val layoutParams = binding.root.layoutParams//用父布局的原高度 + 软键盘弹出的高度 设置为父布局的新高度,软键盘就实际是覆盖了空白的部分,就不会遮挡住原popupWindow的内容了layoutParams.height = binding.root.measuredHeight+heightbinding.root.layoutParams = layoutParamsbinding.root.invalidate()}override fun keyBoardHide(height: Int) {"keyBoardHide : $height".log()//关闭软键盘时,再把布局高度设置回来val layoutParams = binding.root.layoutParamslayoutParams.height = binding.root.measuredHeight-heightbinding.root.layoutParams = layoutParamsbinding.root.invalidate()}})}

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

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

相关文章

Python程序员面试准备:八股文题目与解答思路

目录 描述一下Python中的列表推导式(List Comprehension)及其用法。 代码示例: 解答思路: 解释一下Python中的装饰器(Decorator)及其作用。 代码示例: 输出: 解答思路: 谈谈Python中的GIL(Global Interprete…

四步玩转数字名片-- 推贴,让你的名片飞起来

四步玩转数字名片-- 推贴,让你的名片飞起来 名片设计路径: 1-进入编辑查看名片→点击【创建名片:完善名片信息】 2-进入编辑界面→编辑个人业务,公司组织业务 3-创建多种业务名片。 头像即第一印象; 好照片让客户的关…

Gitee教程2(完整流程)

1.配置git git config --global user.name "用户名" git config --global user.email "密码" 如何获取? gitee右上角加号点击新建仓库,仓库名随便起一个就行 找到这条命令,把这两句一个一个复制到vscode终端就行 2.创建g…

网络基础与通信原理:构建数字世界的框架

目录 初识计算机网络 网络介绍 按照拓扑分类 按地域分类 网络设备 交换机(switch) 路由器(router) 传输介质 双绞线 光纤 光纤速度 ISO ISO和OSI有什么关系呢? OSI七层模型 TCP/IP四层 TCP/IP协议族 …

VMware ESXi 8.0的安装、配置、使用

VMware ESXi 8.0的安装、配置、使用 ESXi的安装与配置下载镜像安装网络配置 Web控制台的管理操作激活开启直通网络配置修改电源模式创建虚拟机 其他ESXI秘钥克隆虚拟机 ESXi的安装与配置 下载镜像 官网:https://www.vmware.com/ 文档:https://docs.vm…

提示词工程简单介绍

提示词工程,又称为Prompt Engineering,是自然语言处理(NLP)领域中的一个重要概念,特别是在与语言模型(如ChatGPT)交互时。它涉及使用精心设计的提示词或指令来引导模型生成特定类型的响应。 …

R语言【raster】——raster():创建一个RasterLayer对象

Package raster version 3.6-27 Description 创建RasterLayer对象的方法。RasterLayer对象可以从无到有,一个文件,一个范围对象,一个矩阵,一个“图像”对象,或者从Raster*, Spatial*, im (spat…

LeetCode--代码详解 59. 螺旋矩阵 II

59. 螺旋矩阵 II 题目 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入&a…

【Python】 剪辑法欠采样 CNN压缩近邻法欠采样

借鉴:关于K近邻(KNN),看这一篇就够了!算法原理,kd树,球树,KNN解决样本不平衡,剪辑法,压缩近邻法 - 知乎 但是不要看他里面的代码,因为作者把代码…

深入探索STM32的存储选项:片内RAM、片内Flash与SDRAM

博客:深入探索STM32的存储选项:片内RAM、片内Flash与SDRAM 在嵌入式系统设计中,存储管理是一个至关重要的方面,尤其是对于基于STM32这类强大的微控制器来说。STM32系列微控制器因其高性能、低功耗以及灵活的存储选项而广受欢迎。本…

RabbitMQ集群架构

1.RabbitMQ集群模式介绍 普通集群 默认的集群模式,比如有节点node1、node2和node3,三个节点是普通集群,但是他们仅有相同的元数据,即交换机、队列的结构消息只存在其中的一个节点里面,假如消息A存储在node1节点&#x…

jquery将网页html文档导出为pdf图片

jquery将网页html文档导出为pdf图片 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

leetcode经典题库(简单)

文章目录 1.两数之和2.反转链表3.合并两个有序列表4.合并两个有序链表5.删除有序数组中的重复项6.从数组中移除元素7. 搜索指定数值在数组中的插入位置8. 数组最后一位加一9. 合并两个有序数组在leetcode上刷了几个和数组相关的简单题,记录在这里。 1.两数之和 给定一个整数…

Qt多线程调用python并接收调用数据

功能: qt中用多线程的方式调用python脚本,完成C++和python之间的数据交互。为了满足多任务并发的要求,将调用python的逻辑部分封装到QThread的子类PyApiThread中。 主要实现: 包括PyApiThread的实现以及在主线程中如何使用 PyApiThread的的实现,分.h和.cpp两个文件 #ifnd…

Python中HTTP请求的安全性考虑与实践:安全帽下的网络舞者

在Python的HTTP请求世界里&#xff0c;安全性就像是一个必不可少的舞伴&#xff0c;时刻陪伴着你的网络舞步。想象一下&#xff0c;你正在举办一场网络舞会&#xff0c;而安全性则是那个穿着防弹舞衣&#xff0c;戴着安全帽的忠诚舞伴&#xff0c;确保你在舞池中尽情舞动而不必…

JAVA面试题21

Java中的四个访问修饰符&#xff08;access modifiers&#xff09;是什么&#xff1f;它们的区别是什么&#xff1f; 答案&#xff1a;Java中的四个访问修饰符是public、private、protected和默认&#xff08;即不使用修饰符&#xff09;。它们的区别在于它们允许的访问级别不同…

百度百科词条创建机构有哪些?

百度百科&#xff0c;作为一个权威的知识分享平台&#xff0c;拥有着极高的权重和流量。在这个平台上&#xff0c;词条的创建和维护显得尤为重要&#xff0c;它直接关系到一个人或企业的形象和品牌的塑造。因此&#xff0c;百度百科词条的创建和维护逐渐成为了一个专业化的服务…

数据结构---字典树(Tire)

字典树是一种能够快速插入和查询字符串的多叉树结构&#xff0c;节点的编号各不相同&#xff0c;根节点编号为0 Trie树&#xff0c;即字典树&#xff0c;又称单词查找树或键树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。 核心思想也是通过空间来换取时间上的…

C#写的一个计算DCI-P3色域和SRGB的小工具

文章最后附带分享链接与提取码 方便需要测试屏幕的小伙伴&#xff0c;只需要输入RGB就能得到覆盖率与比率&#xff0c;W计算色温&#xff0c;不测也要写上&#xff0c;不然会报错 链接&#xff1a;https://pan.baidu.com/s/1wdmAwmwiXjNvn1tGsvy0HA 提取码&#xff1a;1234

安卓学习笔记之五:Android Studio_骰子案例3(Kotlin搭配 Jetpack Compose实现)

使用 Compose 创建一款交互式 Dice Roller Android 应用。 完成&#xff1a; 定义可组合函数。使用组合创建布局。使用 Button 可组合项创建按钮。导入 drawable 资源。使用 Image 可组合项显示图片。使用可组合项构建交互式界面。使用 remember 可组合项将组合中的对象存储到…