android dialog遮挡键盘,彻底解决软键盘遮挡DialogFragment
问题描述
点击edittext,弹出软键盘,dialog略微上移,edittext和下面的按钮还是被遮挡,上移的部分被切割
解决方案
设置dialog的inputMode,取消软键盘弹出自动上移
监听软键盘弹出事件,动态设置dialog的paddingBottom
override fun init() {
dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
globalListener = KeyboardUtils.registerSoftInputChangedListener(activity, object : KeyboardUtils.OnSoftInputChangedListener {
override fun onSoftInputChanged(height: Int) {
val activityPos = intArrayOf(0, 0)
val dialogPos = intArrayOf(0, 0)
activity.window.decorView.getLocationOnScreen(activityPos)
getLocationOnScreen(dialogPos)
val gap = activity.window.decorView.bottom + activityPos[1] - (bottom + dialogPos[1])
if (height > 10 && gap < height) {
dialog?.window?.decorView?.setPadding(0, 0, 0, height - gap + 50)
} else {
dialog?.window?.decorView?.setPadding(0, 0, 0, 0)
}
}
})
}
override fun onDestroy() {
super.onDestroy()
if (globalListener != null) {
KeyboardUtils.unregisterSoftInputChangedListener(activity, globalListener!!)
}
}
fun registerSoftInputChangedListener(activity: Activity,
listener: OnSoftInputChangedListener?)
: ViewTreeObserver.OnGlobalLayoutListener {
val contentView = activity.findViewById(android.R.id.content)
sContentViewInvisibleHeightPre = getContentViewInvisibleHeight(activity)
val globalListener = ViewTreeObserver.OnGlobalLayoutListener {
if (listener != null) {
val height = getContentViewInvisibleHeight(activity)
if (sContentViewInvisibleHeightPre != height) {
listener.onSoftInputChanged(height)
sContentViewInvisibleHeightPre = height
}
}
}
contentView.viewTreeObserver.addOnGlobalLayoutListener(globalListener)
return globalListener
}
fun unregisterSoftInputChangedListener(activity: Activity,
listener: ViewTreeObserver.OnGlobalLayoutListener) {
val contentView = activity.findViewById(android.R.id.content)
contentView.viewTreeObserver.removeOnGlobalLayoutListener(listener)
}
private fun getContentViewInvisibleHeight(activity: Activity): Int {
val contentView = activity.findViewById(android.R.id.content)
val outRect = Rect()
contentView.getWindowVisibleDisplayFrame(outRect)
return contentView.bottom - outRect.bottom
}
总结
dialog销毁一定要移除global监听,否则回调里面拿到的window是上一次的
android dialog遮挡键盘,彻底解决软键盘遮挡DialogFragment相关推荐
- Android 模仿QQ登录界面解决软键盘遮挡问题
Android 软件盘弹出可能会遮挡住界面上的某些控件.当 windowSoftInputMode 为 adjustPan 时,一般不会挡住 EditText,但是假如 EditText 下面是一个登 ...
- android 软键盘遮挡登陆按钮的问题,Android优雅的方式解决软键盘遮挡按钮问题
前言 比如在进行登录的操作中,用户输入完密码之后,肯定是想直接点击登录按钮的.返回键隐藏软键盘这样的体验肯定很糟糕,程序员,遇到问题解决问题. 实现1 xml android:id="@+i ...
- Android爬坑之旅:软键盘挡住输入框问题的终极解决方式
本文由BarryZhang原创,同一时候首发于diycode.cc.barryzhang.com .github.com/barryhappy.非商业转载请注明作者和原文链接. 前言 开发做得久了.总 ...
- Android爬坑之旅:软键盘挡住输入框问题的终极解决方案
前言 开发做得久了,总免不了会遇到各种坑. 而在Android开发的路上,『软键盘挡住了输入框』这个坑,可谓是一个旷日持久的巨坑--来来来,我们慢慢看. 入门篇 Base 最基本的情况,如图所示:在页 ...
- 如何解决软键盘弹出引起的各种不适
1.如何解决软键盘弹出引起的各种不适 2.android软键盘弹出引起的各种不适终极解决方案 3.android软键盘弹出引起的各种不适终极解决方案 4.android软键盘弹出,会把原来的界面挤上去 ...
- android EditText取消焦点且退出软键盘
android EditText取消焦点且退出软键盘 最近发现,如果在一个activity中直接加入EditText的话,每次打开这个activity的时候,就会自动打开软键盘,并且点哪里都取消不了. ...
- 【Android笔记50】Android应用如何获取系统服务(软键盘管理器、闹钟管理器)
这篇文章,主要介绍Android应用如何获取系统服务(软键盘管理器.闹钟管理器). 目录 一.获取系统服务 1.1.软键盘显示和隐藏 (1)showSoftInput显示软键盘
- android隐藏软键盘方法,Android使用InputMethodManager显示和隐藏软键盘
Android主要用InputMethodManager来对软键盘进行管理.手动显示或隐藏软键盘前需要先获取InputMethodManager. InputMethodManager imm = ( ...
- Android中获取软键盘状态和软键盘高度
应用场景 在Android应用中有时会需要获取软键盘的状态(即软键盘是显示还是隐藏)和软键盘的高度.这里列举了一些可能的应用场景. 场景一 当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一 ...
- android点击键盘外关闭软键盘
安卓功能记录之点击键盘外关闭软键盘,用于日常记录 //关闭软键盘@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.g ...
最新文章
- oracleHelper 操作帮助类
- vbscript input select 添加个option根据value值到指定位置--相当于排序
- DNS服务器搭建笔记
- 想在VR中体验暴雪爸爸的游戏,还得再等等
- shell 函数返回值接收问题
- 不用羡慕BAT,自己手工也能搭建伪基站监控系统
- Eclipse 高亮显示选中的相同变量
- 外星人入侵 python 飞船位置_《python从入门到实践》项目一:外星人入侵
- 【预训练模型】一文串起从NLP到CV 预训练技术和范式演进
- 136 - Ugly Numbers
- ssl 命令访问其他的服务器
- Chrome 去掉“该网站的安全证书不受信任!”的提示
- 猜年龄python实现
- java实现md5签名算法
- 实用 Windows 软件系列分享(七)
- 干货秘籍:网易游戏《率土之滨》原画设计师分享创作设计经验
- oracle 存储过程带入参,oracle中带参存储过程的使用
- 智慧景区:EasyCVR视频+智能分析,助力景区智慧化服务监管
- html代码劫持教程,记录一次 JavaScript解密(跳转劫持代码)全过程
- Centos安装 Node.js v12.16.1 和 v16.14
热门文章
- 2014年牡丹江现场赛打铁记
- CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below m
- 李飞飞CS231n课程-中文笔记(包括课后作业要求)翻译汇总
- html 网页不可以复制粘贴,网页上的文字不能复制,三种方法教你复制全网文字...
- android点击复制链接地址,在Android中的EditView中可点击链接和复制/粘贴菜单
- c语言中swipe的作用,浅谈在vue中使用mint-ui swipe遇到的问题
- 观察containerd-shim-runc-v2进程与容器里的1号进程
- Frank-Cucumber - Core Frank Steps
- Win10锁屏壁纸图片保存
- 四六级成绩批量查询器